1050 棋盤染色 2

2021-09-25 04:49:07 字數 2230 閱讀 1271

1050棋盤染色2

題目描述description

有乙個5*n的棋盤,棋盤中的一些格仔已經被染成了黑色,你的任務是對最少的格仔染色,使得所有的黑色能連成一塊。

輸入描述input description

第一行乙個整數n(<=100),接下來n行每行乙個長度為5的01串,1表示所在格仔已經被染成了黑色,0表示所在格仔沒有被染色。

輸出描述output description

第一行乙個整數n(<=100),接下來n行每行乙個長度為5的01串,1表示所在格仔已經被染成了黑色,0表示所在格仔沒有被染色。

樣例輸入sample input5

11100

11000

10000

01111

11111

樣例輸出sample output1

資料範圍及提示data size & hint

n(<=100)

輪廓型dp,又名插頭dp。

這道題用廣度記憶化搜尋和插頭dp,逐個格仔遞推。

#include

#include

#define ref(i,x,y) for(int i=x;i<=y;i++)

#define get(t,k) (((t)>>(2*(5-(k))))%4)

#define aj (1<<2*(5-(y)))

using namespace std;

int n,h,t,judx,judy;

int a[101][6],f[102][6][1025];

struct qmemq[500001];

void init()

void push(int x,int y,int s,int v)

return 1;

int main()

cin>>n;

ref(i,1,n)

char s[6];cin>>s;

ref(j,0,4)a[i][j+1]=s[j]-48;

ref(i,1,n)ref(j,1,5)if(a[i][j])

init();push(1,1,0,0);

while(hh++;

if(q[h].x>n)continue;

int x,y,s,ff,w1,w2,ts;

x=q[h].x;y=q[h].y;s=q[h].s;ff=f[x][y][s];

w1=get(s,y-1);w2=get(s,y);ts=s-aj*w2;

bool judge=0;

if ((only(s,w1,y-1)&&x==n)||only(s,w2,y)||a[x][y])judge=1;

if (a[x][y])ff--;

if(y<5)

if (!judge)push(x,y+1,ts,ff);

if(w1==0&&w2==0)push(x,y+1,ts+aj*getp(s),ff+1);else

if(w1==0&&w2>0)push(x,y+1,s,ff+1);else

if(w1>0&&w2==0)push(x,y+1,ts+aj*w1,ff+1);else

push(x,y+1,ch(s,w2,w1),ff+1);

}else{

if (!judge)push(x+1,1,ts,ff);

if(w1==0&&w2==0)push(x+1,1,ts+aj*getp(s),ff+1);else

if(w1==0&&w2>0)push(x+1,1,s,ff+1);else

if(w1>0&&w2==0)push(x+1,1,ts+aj*w1,ff+1);else

push(x+1,1,ch(s,w2,w1),ff+1);

int ans=f[n+1][1][0];

ref(i,1,1024)if(ok(i)&&ans>=f[n+1][1][i]){

ans=min(ans,f[n+1][1][i]);

//cout

1050 棋盤染色 2

時間限制 1 s 空間限制 128000 kb 題目等級 大師 master 題解有乙個5 n的棋盤,棋盤中的一些格仔已經被染成了黑色,你的任務是對最少的格仔染色,使得所有的黑色能連成一塊。輸入描述 input description 第一行乙個整數n 100 接下來n行每行乙個長度為5的01串,1...

棋盤染色2

題目描述 有乙個5 n的棋盤,棋盤中的一些格仔已經被染成了黑色,你的任務是對最少的格仔染色,使得所有的黑色能連成一塊。輸入描述 第一行乙個整數n n 100 接下來n行每行乙個長度為5的01串,1表示所在格仔已經被染成了黑色,0表示所在格仔沒有被染色。輸出描述 輸出乙個整數,表示最少需要染色的格仔數...

1049 棋盤染色

時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解檢視執行結果 有乙個5 5的棋盤,上面有一些格仔被染成了黑色,其他的格仔都是白色,你的任務的對棋盤一些格仔進行染色,使得所有的黑色格仔能連成一塊,並且你染色的格仔數目要最少。讀入乙個初始棋盤的狀態,輸出最少需要對多少個格仔進行染...