1. 程式人生 > >CODEVS——T 1049 棋盤染色

CODEVS——T 1049 棋盤染色

script btn bool per 初始 遍歷 active head rsa

http://codevs.cn/problem/1049/

時間限制: 1 s 空間限制: 128000 KB 題目等級 : 黃金 Gold 題目描述 Description

有一個5×5的棋盤,上面有一些格子被染成了黑色,其他的格子都是白色,你的任務的對棋盤一些格子進行染色,使得所有的黑色格子能連成一塊,並且你染色的格子數目要最少。讀入一個初始棋盤的狀態,輸出最少需要對多少個格子進行染色,才能使得所有的黑色格子都連成一塊。(註:連接是指上下左右四個方向,如果兩個黑色格子只共有一個點,那麽不算連接)

輸入描述 Input Description

輸入包括一個5×5的01矩陣,中間無空格,1表示格子已經被染成黑色。

輸出描述 Output Description

輸出最少需要對多少個格子進行染色

樣例輸入 Sample Input

11100

11000

10000

01111

11111

樣例輸出 Sample Output

1

數據範圍及提示 Data Size & Hint 叠代加深搜索 枚舉每次染色的格子數,使用完所有次數後,遍歷全圖統計黑格子聯通的個數 染色時,可以從左上,向右下 依次進行
 1 #include <cstring>
 2 #include <cstdio>
 3 
 4 char s[5][5];
 5 int ans,tot,cnt,map[5][5];
 6 
 7 bool vis[5][5];
 8 int sx,fx[4]={0,1,0,-1};
 9 int sy,fy[4]={1,0,-1,0};
10 
11 void Traversal(int x,int y)
12 {
13     ++tot;vis[x][y]=1;
14     for(int xx,yy,i=0; i<4; ++i)
15 { 16 xx=x+fx[i]; yy=y+fy[i]; 17 if(!vis[xx][yy]&&xx>=0&&xx<5&&yy>=0&&yy<5&&map[xx][yy]) 18 Traversal(xx,yy); 19 } 20 } 21 22 bool DFS(int x,int y,int now) 23 { 24 if(!now) 25 { 26 tot=0; 27 memset(vis,0,sizeof(vis)); 28 Traversal(sx,sy); 29 return (ans+cnt)==tot; 30 } 31 for(int yy=y+1; yy<5; ++yy) 32 { 33 if(map[x][yy]) continue; 34 map[x][yy]=1; 35 if(DFS(x,yy,now-1)) return 1; 36 map[x][yy]=0; 37 } 38 for(int xx=x+1; xx<5; ++xx) 39 for(int yy=0; yy<5; ++yy) 40 { 41 if(map[xx][yy]) continue; 42 map[xx][yy]=1; 43 if(DFS(xx,yy,now-1)) return 1; 44 map[xx][yy]=0; 45 } 46 return 0; 47 } 48 49 int Presist() 50 { 51 for(int i=0; i<5; ++i) 52 scanf("%s",s[i]); 53 for(int i=0; i<5; ++i) 54 for(int j=0; j<5; ++j) 55 { 56 map[i][j]=s[i][j]-0; 57 if(map[i][j]) cnt++,sx=i,sy=j; 58 } 59 for(; !DFS(0,0,ans); ) ans++; 60 printf("%d\n",ans); 61 return 0; 62 } 63 64 int Aptal=Presist(); 65 int main(){;}

CODEVS——T 1049 棋盤染色