洛谷P1162 填涂颜色 解题报告

by MedalPluS

题目描述:

由数字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。
输出格式:
已经填好数字2的完整方阵。

分析:

首先根据题目的意思,就是将被1包围的0改为2

直接做不好做,我们来研究一下,题目是求被1包围,注意,包围

没错!那么反过来思考,就很好做了,只要将没有被包围的填充为0,其余都是2

我们先开辟一个数组b,记录输入a,但是,首先b全赋值为2,然后对于a,如果有(i,j)为1,则b(i,j)=1

然后BFS,起始状态就是与边界相通的格子,然后就能BFS,对于每一个能拓展到的0的格子,就将其在b数组中变为0

然后拓展结束后b数组就是答案

时间复杂度O(n2)

代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <queue>
 4 using namespace std;
 5
 6 const int maxn=101;
 7
 8 int a[maxn][maxn],b[maxn][maxn];
 9 int n;
10 bool vis[maxn][maxn];
11
12 struct xOy{
13     int x,y;
14 };
15
16 void bfs(){
17     queue<xOy> q;
18     xOy head;
19     int i;
20     for(i=1;i<=n;i++){
21       if(a[i][1]==0)q.push((struct xOy){i,1});
22       if(a[i][n]==0)q.push((struct xOy){i,n});
23     }
24     for(i=1;i<=n;i++){
25       if(a[1][i]==0)q.push((struct xOy){1,i});
26       if(a[n][i]==0)q.push((struct xOy){n,i});
27     }
28     while(!q.empty()){
29         head=q.front();
30         q.pop();
31         if(vis[head.x][head.y])continue;
32         vis[head.x][head.y]=true;
33         b[head.x][head.y]=0;
34         if(head.x-1>0 && a[head.x-1][head.y]==0)q.push((struct xOy){head.x-1,head.y});
35         if(head.x+1<=n && a[head.x+1][head.y]==0)q.push((struct xOy){head.x+1,head.y});
36         if(head.y-1>0 && a[head.x][head.y-1]==0)q.push((struct xOy){head.x,head.y-1});
37         if(head.y+1<=n && a[head.x][head.y+1]==0)q.push((struct xOy){head.x,head.y+1});
38     }
39     return ;
40 }
41
42 int main(){
43     cin>>n;
44     int i,j;
45     for(i=1;i<=n;i++)
46       for(j=1;j<=n;j++)
47         b[i][j]=2;
48     for(i=1;i<=n;i++)
49       for(j=1;j<=n;j++){
50         cin>>a[i][j];
51         if(a[i][j]==1)b[i][j]=1;
52     }
53     bfs();
54     for(i=1;i<=n;i++){
55       for(j=1;j<=n;j++)
56         cout<<b[i][j]<<" ";
57       cout<<endl;
58     }
59     return 0;
60 }
时间: 2024-10-15 14:03:17

洛谷P1162 填涂颜色 解题报告的相关文章

洛谷OJ P1074 靶形数独 解题报告

洛谷OJ P1074 靶形数独 解题报告 by MedalPluS 题目描述  小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低.但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“靶形数独”,作为这两个孩子比试的题目. 靶形数独的方格同普通数独一样,在 9 格宽×9 格高的大九宫格中有 9 个 3 格宽×3 格高的小九宫格(用粗黑色线隔开的).在这个大九宫格中,有一些数字是已知的,根据这些数字,利用逻辑推理,

P1162 填涂颜色

P1162 填涂颜色 题目描述 由数字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

Luogu P1162 填涂颜色(bfs)

P1162 填涂颜色 题目描述 由数字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

洛谷OJ P1010 幂次方 解题报告

洛谷OJ P1010 幂次方 解题报告 by MedalPluS 题目描述   任何一个正整数都可以用2的幂次方表示.例如        137=2^7+2^3+2^0         同时约定方次用括号来表示,即a^b 可表示为a(b).由此可知,137可表示为:        2(7)+2(3)+2(0)进一步:7= 2^2+2+2^0   (21用2表示)        3=2+20   所以最后137可表示为:        2(2(2)+2+2(0))+2(2+2(0))+2(0)又如

洛谷OJ P1141 01迷宫 解题报告

洛谷OJ P1141 01迷宫 解题报告 by MedalPluS [题目描述]    有一个仅由数字0与1组成的n×n格迷宫.若你位于一格0上,那么你可以移动到相邻4格中的某一格1上,同样若你位于一格1上,那么你可以移动到相邻4格中的某一格0上.你的任务是:对于给定的迷宫,询问从某一格开始能移动到多少个格子(包含自身).   [输入描述]   输入的第1行为两个正整数n,m.  下面n行,每行n个字符,字符只可能是0或者1,字符之间没有空格.  接下来m行,每行2个用空格分隔的正整数i,j,对

洛谷OJ P1433 吃奶酪 解题报告

洛谷OJ P1433 吃奶酪 解题报告 by MedalPluS 题目描述 房间里放着n块奶酪.一只小老鼠要把它们都吃掉,问至少要跑多少距离?老鼠一开始在(0,0)点处. 输入描述 第一行一个数n  (n<=15)接下来每行2个实数,表示第i块奶酪的坐标.两点之间的距离公式=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)) 输出描述 一个数,表示要跑的最少距离,保留2位小数. 分析 这题很明显就是一个搜索题,枚举一下1_n的全排列,然后从0开始,按照排列一个一个算,时间

luogu P1162 填涂颜色

P1162 填涂颜色 题目描述 由数字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

洛谷1098 字符串的展开 解题报告

洛谷1098 字符串的展开 本题地址:http://www.luogu.org/problem/show?pid=1098 题目描述 在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或者“4-8”的字串,我们就把它当作一种简写,输出时,用连续递增的字母获数字串替代其中的减号,即,将上面两个子串分别输出为“defgh”和“45678”.在本题中,我们通过增加一些参数的设置,使字符串的展开更为灵活.具体约定如下:(1) 遇到下面的情

洛谷1125 笨小猴 解题报告

洛谷1125 笨小猴 本题地址:http://www.luogu.org/problem/show?pid=1125 题目描述 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!这种方法的具体描述如下:假设maxn是单词中出现次数最多的字母的出现次数,minn是单词中出现次数最少的字母的出现次数,如果maxn-minn是一个质数,那么笨小猴就认为这是个Lucky Word,这样的单词很可能就是正确的答案. 输入输