首页 > 代码库 > 1162 填涂颜色
1162 填涂颜色
难度:普及-
题目类型: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。
打了一下午牌就做了这一道题,明天比区赛……我抓紧时间去抱佛脚了。
1162 填涂颜色
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。