1162 填涂颜色

Posted tat296847

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 填涂颜色的主要内容,如果未能解决你的问题,请参考以下文章

P1162 填涂颜色

luogu P1162 填涂颜色

Luogu P1162 填涂颜色(bfs)

1162 填涂颜色

P1162 填涂颜色 洛谷

填涂颜色