输入一个m*n的矩阵,矩阵中的元素包含0、1、2(其中0表示什么都没有,1表示白纸,2表示墨水),每秒墨水会向四周(上下左右)进行染色,被染色的纸也会对周围的纸进行染色。试问,对于输入的矩阵,多久才能完全染色?如果最终不能完全染色,输出-1.
解析:自己手动进行染色,并模拟队列,会发现如果完全染色,队列左后一个元素所带的时间step就是总用时
# include<bits/stdc++.h>
using namespace std;
/*不用标记走没走过,因为染过了的就是2*/
char grid[100][100];
int h, w;
int dir[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
struct node{
int x;
int y;
int step;
};
int BFS(){
int ans=0;
queue<node> q; //创建队列
for(int i=1;i<=h;i++){
for(int j=1;j<=w;j++){
if(grid[i][j]=='2')
q.push({i,j,0}); //把一开始就是绿色的入队
}
}
while(!q.empty()){
int size=q.size(); //当前队列有多少个
for(int i=1;i<=size;i++){
node now=q.front();
q.pop();
ans=now.step;
for(int k=0;k<4;k++){
int x=now.x+dir[k][0];
int y=now.y+dir[k][1];
if(grid[x][y]=='1'){
grid[x][y]='2'; //关键代码!!染色
q.push({x,y,now.step+1}); //关键代码 !!
}
}
}
}
for(int i=1;i<=h;i++){
for(int j=1;j<=w;j++){
if(grid[i][j]=='1')
ans=-1; //未完全染色
}
}
return ans;
}
int main(){
/*-------初始化-------*/
while(scanf("%d%d",&h,&w)){
if(h==0&&w==0) break;
memset(grid,0,sizeof(grid));
for(int i=1;i<=h;i++){
scanf("%s",grid[i]+1);
}
/*染色*/
int result=BFS();
printf("%d\n",result);
}
return 0;
}