题目大意:01矩阵,1表示黑色,0表示白色,求将白色染成黑色最少的次数
使黑色成为一整个联通块。
题解:
搜索bfs 90...
dfs判断连通
#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; int cnt,ans,flag; int map[7][7],vis[7][7]; int mx[4]={1,0,0,-1}, my[4]={0,-1,1,0}; string s; struct node{ int x,y; }a[30]; inline void find(int x,int y){ for(int i=0;i<4;i++){ int xx=x+mx[i],yy=y+my[i]; if(map[xx][yy]&&!vis[xx][yy]){ vis[xx][yy]=true; find(xx,yy); } } } bool check(){ int gg=0; memset(vis,0,sizeof(vis)); for(int i=1;i<=5;i++) for(register int j=1;j<=5;j++) if(!vis[i][j]&&map[i][j]){ gg++;if(gg>1)return false; vis[i][j]=true;find(i,j); } return true; } void dfs(int x,int sum){ if(x==cnt+1){ if(check()) ans=min(ans,sum); return; } map[a[x].x][a[x].y]=1; dfs(x+1,sum+1); map[a[x].x][a[x].y]=0; dfs(x+1,sum); } int main(){ for(int i=1;i<=5;i++){ cin>>s; for(int j=1;j<=5;j++){ map[i][j]=s[j-1]-'0'; if(!map[i][j])a[++cnt].x=i,a[cnt].y=j; } } ans=5*5; dfs(1,0); printf("%d\n",ans); return 0; }