难度:普及-
题目类型:BFS
提交次数:5
涉及知识:BFS
题目描述
由数字0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向。现要求把闭合圈内的所有空间都填写成2.例如:6X6的方阵(n=6),涂色前和涂色后的方阵如下:
0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 1 1 1 0 0 1 1 1 1
0 1 1 0 0 1 0 1 1 2 2 1
1 1 0 0 0 1 1 1 2 2 2 1
1 0 0 0 0 1 1 2 2 2 2 1
1 1 1 1 1 1 1 1 1 1 1 1
输入输出格式
输入格式:
每组测试数据第一行一个整数:n。其中n(1<=n<=30)
接下来n行,由0和1组成的nXn的方阵。
方阵内只有一个闭合圈,圈内至少有一个0。
//感谢黄小U饮品指出本题数据和数据格式不一样. 已修改(输入格式)
输出格式:
已经填好数字2的完整方阵。
代码:
1 #include<iostream> 2 #include<queue> 3 using namespace std; 4 int a[31][31]; 5 bool visited[31][31]; 6 int n; 7 struct pos{ 8 int x; 9 int y; 10 pos(int xx, int yy):x(xx), y(yy){} 11 }; 12 bool check(int x, int y){ 13 if(x>=1&&x<=n&&y>=1&&y<=n&&a[x][y]!=1&&visited[x][y]==false) 14 return true; 15 return false; 16 } 17 void print(){ 18 int i, j; 19 for(i = 1; i <= n; i++){ 20 for(j = 1; j <= n; j++){ 21 cout<<a[i][j]<<" "; 22 } 23 cout<<endl; 24 } 25 cout<<endl; 26 } 27 void floodfill(int x, int y){ 28 queue<pos>q; 29 q.push(pos(x,y)); 30 while(!q.empty()){ 31 pos temp = q.front(); 32 if(check(temp.x+1, temp.y)) 33 q.push(pos(temp.x+1, temp.y)); 34 if(check(temp.x-1, temp.y)) 35 q.push(pos(temp.x-1, temp.y)); 36 if(check(temp.x, temp.y+1)) 37 q.push(pos(temp.x, temp.y+1)); 38 if(check(temp.x, temp.y-1)) 39 q.push(pos(temp.x, temp.y-1)); 40 a[temp.x][temp.y] = 0; 41 visited[temp.x][temp.y]=true; q.pop(); 42 } 43 return; 44 } 45 int main(){ 46 cin>>n; 47 int i, j, x; 48 for(i = 1; i <= n; i++) 49 for(j = 1; j <= n; j++){ 50 cin>>x; 51 if(x==0) a[i][j] = 2; 52 else a[i][j] = 1; 53 } 54 for(i = 1; i <= n; i++){ 55 if(check(1, i)) 56 floodfill(1, i); 57 if(check(n, i)) 58 floodfill(n, i); 59 } 60 61 for(i = 1; i <= n; i++){ 62 if(check(i, 1)) 63 floodfill(i, 1); 64 if(check(i, n)) 65 floodfill(i, n); 66 } 67 print(); 68 return 0; 69 }
备注:
BFS水题,看了解析才知道了一个小技巧。最开始把所有的0填充成2,然后从边界开始bfs,从边界能走到的地方都标回0。
打了一下午牌就做了这一道题,明天比区赛……我抓紧时间去抱佛脚了。