首页 > 代码库 > 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 填涂颜色