题目描述
由数字0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向。现要求把闭合圈内的所有空间都填写成2.例如:6X6的方阵(n=6),涂色前和涂色后的方阵如下:
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1
输入输出格式
输入格式:每组测试数据第一行一个整数:n。其中n(1<=n<=30)
接下来n行,由0和1组成的nXn的方阵。
方阵内只有一个闭合圈,圈内至少有一个0。
//感谢黄小U饮品指出本题数据和数据格式不一样. 已修改(输入格式)
输出格式:已经填好数字2的完整方阵。
输入输出样例
说明
扫描二维码关注公众号,回复:
1675657 查看本文章
1<=n<=30
思维分析:
就是把周围一圈的为0的位置标记下来,然后从这些位置开始bfs遇到的为0的都把相应位置的map1从2改为0,直到遇到1为止
#include<iostream> #include<algorithm> #include<queue> using namespace std; int map1[31][31];//设置两个地图,具体操作看主函数里面对两个数组的使用方法 int map2[31][31]; int res[31][31]; int n; struct node { int x; int y; }Node; void bfs() { queue<node> asd; for (int i = 1; i <= n; i++) { if (map2[i][1] == 0) { Node.x = i; Node.y = 1; asd.push(Node); } if (map2[n][i] == 0) { Node.x = n; Node.y = i; asd.push(Node); } if (map2[1][i] == 0) { Node.x = 1; Node.y = i; asd.push(Node); } if (map2[i][n] == 0) { Node.x = i; Node.y = n; asd.push(Node); } } while (!asd.empty()) { struct node head; head = asd.front(); asd.pop(); if (res[head.x][head.y] == 1) continue; res[head.x][head.y] = 1; map1[head.x][head.y] = 0; if (head.x - 1 > 0 && map2[head.x - 1][head.y] == 0) { Node.x = head.x - 1; Node.y = head.y; asd.push(Node); } if (head.x+1 < n && map2[head.x + 1][head.y] == 0) { Node.x = head.x + 1; Node.y = head.y; asd.push(Node); } if (head.y - 1 > 0 && map2[head.x][head.y-1] == 0) { Node.x = head.x; Node.y = head.y - 1; asd.push(Node); } if (head.y + 1 < n && map2[head.x][head.y+1] == 0) { Node.x = head.x; Node.y = head.y + 1; asd.push(Node); } } return; } void prins() { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { cout << map1[i][j] << " "; } cout << endl; } } int main() { cin >> n; for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++)//循环,使得让map1里面除了2就是1,然后map2是正常的地图 { cin >> map2[i][j]; if (map2[i][j] == 1) map1[i][j] = 1; else map1[i][j] = 2; } } bfs(); prins(); system("pause"); return 0; }