浅谈:众做周知BFS的写法太多了,用队列用数组都可以,把数组用成队列的模样的也有;
对于这题我的解法是BFS(队列结构体),这题是BFS的模板题,可算是非常简单了;
思路:首先根据题意可知肯定有空间生成,并且生成的空间肯定不为以墙为边界,是确切的会有一圈1围起来的;所以我们只要对四条边(四次)向外BFS(搜索),若为0先把0变成3,之后对全图遍历将0变成2,再将全图遍历把3变成0
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
int Map[32][32];
int dir[4][2] = {1,0,-1,0,0,-1,0,1};
int n, m, ans;
struct node{
int x, y;
}now;
void BFS(int x, int y){
queue<node>q;
int xx,yy;
Map[x][y] = 3;
now.x = x;
now.y = y;
q.push(now); //把整个结构体压进队列,可以看成压进去两个数,有两排队列
while(!q.empty()){ //当队列不为空会持续
now = q.front(); //取出队列的头部
q.pop(); //弹出队列的 头部
for(int i = 0; i < 4; i++){
xx = now.x+dir[i][0]; //向着x轴方向
yy = now.y+dir[i][1]; //向着y轴方向
if(xx >= 0 && yy >= 0 && xx < n && yy < n && Map[xx][yy] == 0){
now.x = xx;
now.y = yy;
Map[now.x][now.y] = 3;
q.push(now); // 又将下一格压入队列;队列不空while持续
}
}
}
}
int main()
{
scanf("%d",&n);
for( int i = 0; i < n; i++){
for( int j = 0; j < n; j++){
scanf("%d",&Map[i][j]);
}
}
for( int i = 0; i < n; i++){
if(Map[0][i] == 0){
BFS(0,i);
}
if(Map[n-1][i] == 0){
BFS(n-1,i);
}
}
for( int i = 0; i < n; i++){
if(Map[i][0] == 0){
BFS(i,0);
}
if(Map[i][n-1] == 0){
BFS(i,n-1);
}
}
for( int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
if(Map[i][j] == 0){
Map[i][j] = 2;
}
if(Map[i][j] == 3){
Map[i][j] = 0;
}
}
}
for(int i = 0; i < n; i++){
for(int j = 0; j< n; j++){
printf("%d ",Map[i][j]);
}
printf("\n");
}
return 0;
}