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 時間限制 1 s 空間限制 128000 kb 題目等級 大師 master 題解有乙個5 n的棋盤,棋盤中的一些格仔已經被染成了黑色,你的任務是對最少的格仔染色,使得所有的黑色能連成一塊。輸入描述 input description 第一行乙個整數n 100 接下來n行每行乙個長度為5的01串,1... 題目描述 有乙個5 n的棋盤,棋盤中的一些格仔已經被染成了黑色,你的任務是對最少的格仔染色,使得所有的黑色能連成一塊。輸入描述 第一行乙個整數n n 100 接下來n行每行乙個長度為5的01串,1表示所在格仔已經被染成了黑色,0表示所在格仔沒有被染色。輸出描述 輸出乙個整數,表示最少需要染色的格仔數... 時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解檢視執行結果 有乙個5 5的棋盤,上面有一些格仔被染成了黑色,其他的格仔都是白色,你的任務的對棋盤一些格仔進行染色,使得所有的黑色格仔能連成一塊,並且你染色的格仔數目要最少。讀入乙個初始棋盤的狀態,輸出最少需要對多少個格仔進行染...1050 棋盤染色 2
棋盤染色2
1049 棋盤染色