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

codevs——1049 棋盤染色

add 染色 -s 空間 ide mem 輸入 一個點 button

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

枚舉染色的格子數,如果當前染色的個數可以滿足是黑色格子連成一片,即為最終答案。

在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 棋盤染色