codevs——1049 棋盤染色
阿新 • • 發佈:2017-09-20
add 染色 -s 空間 ide mem 輸入 一個點 button
輸入描述 Input Description
1049 棋盤染色
時間限制: 1 s 空間限制: 128000 KB 題目等級 : 黃金 Gold 題目描述 Description
有一個5×5的棋盤,上面有一些格子被染成了黑色,其他的格子都是白色,你的任務的對棋盤一些格子進行染色,使得所有的黑色格子能連成一塊,並且你染色的格子數目要最少。讀入一個初始棋盤的狀態,輸出最少需要對多少個格子進行染色,才能使得所有的黑色格子都連成一塊。(註:連接是指上下左右四個方向,如果兩個黑色格子只共有一個點,那麽不算連接)
輸入包括一個5×5的01矩陣,中間無空格,1表示格子已經被染成黑色。
輸出描述 Output Description輸出最少需要對多少個格子進行染色
樣例輸入 Sample Input11100
11000
10000
01111
11111
樣例輸出 Sample Output1
枚舉染色的格子數,如果當前染色的個數可以滿足是黑色格子連成一片,即為最終答案。
在dfs裏面我們需要搜索染色的位置,然後最終判斷是否合格,合格條件:能夠連成一片的格子的個數等於染色的個數+總黑格的個數
#include<cstdio> #include<cstring> #include<cstdlib> #include<iostream> #include<algorithm> #define N 100 using namespace std; char ch; bool vis[N][N]; int a[N][N],cnt,tot,sx,sy,ans; int xx[4]={0,0,1,-1},yy[4]={1,-1,0,0}; int pd(int x,int y) { tot++;vis[x][y]=true; for(int i=0;i<4;i++) { int fx=x+xx[i],fy=y+yy[i]; if(!vis[fx][fy]&&fx>0&&fy>0&&fx<=5&&fy<=5&&a[fx][fy]) pd(fx,fy); } } int dfs(int x,int y,int now) { if(!now) { tot=0; memset(vis,0,sizeof(vis)); pd(sx,sy); return (cnt+ans)==tot; } for(int fy=y+1;fy<=5;fy++) { if(a[x][fy]) continue; a[x][fy]=true; if(dfs(x,fy,now-1)) return 1; a[x][fy]=false; } for(int fx=x+1;fx<=5;fx++) for(int fy=1;fy<=5;fy++) { if(a[fx][fy]) continue; a[fx][fy]=true; if(dfs(fx,fy,now-1)) return 1; a[fx][fy]=false; } return 0; } int main() { for(int i=1;i<=5;i++) { for(int j=1;j<=5;j++) { scanf("%c",&ch); a[i][j]=ch-‘0‘; if(a[i][j]) sx=i,sy=j,cnt++; } if(i!=5) scanf("\n"); } for(ans=1;;ans++) { if(dfs(1,1,ans)) { printf("%d",ans); return 0; } } }
codevs——1049 棋盤染色