题目坐标
浅谈:众做周知BFS的写法太多了,用队列用数组都可以,把数组用成队列的模样的也有;
对于这题我的解法是BFS(队列结构体),这题是BFS的模板题,可算是非常简单了;
思路:首先根据题意可知肯定有空间生成,并且生成的空间肯定不为以墙为边界,是确切的会有一圈1围起来的;所以我们只要对四条边(四次)向外BFS(搜索),若为0先把0变成3,之后对全图遍历将0变成2,再将全图遍历把3变成0
#include#include #include 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 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; }



