题目链接:https://www.luogu.org/problemnew/show/P1162

这道题是LITTLESUN写的第一道BFS哦!

对于这道题的的思路是把封闭图形外边的0标记一边,在最后输出的时候把没有标记过的0输出为2,其他按照原图输出。

对于这道题的的边界有两种判断方式。第一种是在原图外面加一圈0

AC代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define MAXN 2000
using namespace std;
int G[MAXN][MAXN];
bool vis[MAXN][MAXN];
struct item
{int x;int y;
};
int n;
item a;
item t2;
void bfs()
{queue<item>q;a.x=1;a.y=1;q.push(a);while(!q.empty()){item t=q.front();q.pop();if(G[t.x+1][t.y]==0&&t.x!=n+2&&!vis[t.x+1][t.y]){vis[t.x+1][t.y]=1;t2.x=t.x+1;t2.y=t.y;q.push(t2);}if(G[t.x-1][t.y]==0&&t.x!=1&&!vis[t.x-1][t.y]){vis[t.x-1][t.y]=1;t2.x=t.x-1;t2.y=t.y;q.push(t2);}if(G[t.x][t.y+1]==0&&t.y!=n+2&&!vis[t.x][t.y+1]){vis[t.x][t.y+1]=1;t2.x=t.x;t2.y=t.y+1;q.push(t2);}    if(G[t.x][t.y-1]==0&&t.y!=1&&!vis[t.x][t.y-1]){vis[t.x][t.y-1]=1;t2.x=t.x;t2.y=t.y-1;q.push(t2);}}}int main()
{scanf("%d",&n);for(int i=2;i<=n+1;i++){for(int j=2;j<=n+1;j++){scanf("%d",&G[i][j]);}}bfs();for(int i=2;i<=n+1;i++){for(int j=2;j<=n+1;j++){if(!vis[i][j]&&G[i][j]==0){G[i][j]=2;}}}for(int i=2;i<=n+1;i++){//cout<<endl;for(int j=2;j<=n+1;j++){printf("%d ",G[i][j]);}cout<<endl;}return 0;
}

另一种方法是枚举边界每一个不是一的点作为起点进行BFS

但这个代码不知道哪里锅掉了,只有80分qwq

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define MAXN 2000
using namespace std;
int G[MAXN][MAXN];
bool vis[MAXN][MAXN];
struct item
{int x;int y;
};
int n;
item a;
queue<item> q;
void bfs(item b)
{q.push(b);while(!q.empty()){item t=q.front();q.pop();if(G[t.x+1][t.y]==0&&t.x!=n&&!vis[t.x+1][t.y]){vis[t.x+1][t.y]=1;t.x=t.x+1;t.y=t.y;q.push(t);}if(G[t.x-1][t.y]==0&&t.x!=1&&!vis[t.x-1][t.y]){vis[t.x-1][t.y]=1;t.x=t.x-1;t.y=t.y;q.push(t);}if(G[t.x][t.y+1]==0&&t.y!=n&&!vis[t.x][t.y+1]){vis[t.x][t.y+1]=1;t.x=t.x;t.y=t.y+1;q.push(t);}    if(G[t.x][t.y-1]==0&&t.y!=1&&!vis[t.x][t.y-1]){vis[t.x][t.y-1]=1;t.x=t.x;t.y=t.y-1;q.push(t);}}
}
void work(){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if((i==1||i==n||j==1||j==n)&&G[i][j]!=1){a.x=i;a.y=j;        bfs(a);}}}
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){scanf("%d",&G[i][j]);}}work();for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(!vis[i][j]&&G[i][j]==0){G[i][j]=2;}}}for(int i=1;i<=n;i++){//cout<<endl;for(int j=1;j<=n;j++){printf("%d ",G[i][j]);}cout<<endl;}return 0;
}

转载于:https://www.cnblogs.com/LITTLESUNwl/p/10516634.html

洛谷P1162 填涂颜色相关推荐

  1. 洛谷P1162 填涂颜色(Python搜索)

    P1162 填涂颜色https://www.luogu.com.cn/problem/P1162 题目描述 由数字00组成的方阵中,有一任意形状闭合圈,闭合圈由数字11构成,围圈时只走上下左右44个方 ...

  2. 洛谷 P1162 填涂颜色

    填涂颜色 题目描述 由数字 000 组成的方阵中,有一任意形状闭合圈,闭合圈由数字 111 构成,围圈时只走上下左右 444 个方向.现要求把闭合圈内的所有空间都填写成 222.例如:6×66\tim ...

  3. 洛谷p1162填涂颜色(dfs写法)

    这道题本是放在试炼场bfs里的,但是我觉得dfs好写些 所以就用dfs过了 题目如下 题目描述 由数字0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向.现要求把闭合 ...

  4. 洛谷 P1162 填涂颜色题解

    题目描述 由数字00组成的方阵中,有一任意形状闭合圈,闭合圈由数字11构成,围圈时只走上下左右44个方向.现要求把闭合圈内的所有空间都填写成22.例如:6 \times 66×6的方阵(n=6n=6) ...

  5. 洛谷 P1162 填涂颜色 C++ 深搜 染色法

    题目描述 由数字0组成的方阵中,有一任意形状闭合圈,闭合圈由数字11构成,围圈时只走上下左右4个方向.现要求把闭合圈内的所有空间都填写成2.例如:6×6的方阵(n=6),涂色前和涂色后的方阵如下: 0 ...

  6. 洛谷 P1162 填涂颜色-dfs染色法

    输入: 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 ...

  7. 洛谷 P1162填图颜色

    洛谷 P1162填图颜色 题目链接 #include <bits/stdc++.h> using namespace std; int xx[] = {0, -1, 0, 1}; int ...

  8. P1162 填涂颜色问题(广度优先搜索BFS)

    # 填涂颜色 ## 题目描述 由数字 $0$ 组成的方阵中,有一任意形状闭合圈,闭合圈由数字 1 构成,围圈时只走上下左右 4 个方向.现要求把闭合圈内的所有空间都填写成 2.例如:6*6$的方阵(n ...

  9. P1162 填涂颜色

    填涂颜色 题目描述 由数字 000 组成的方阵中,有一任意形状闭合圈,闭合圈由数字 111 构成,围圈时只走上下左右 444 个方向.现要求把闭合圈内的所有空间都填写成 222.例如:6×66\tim ...

最新文章

  1. B站崩了上热搜,A站跟着躺枪!微信、支付宝:跟我们比起来这是小问题
  2. 黑客常用的远程控制命令
  3. linux正则表达式的使用方法,Linux中基本正则表达式
  4. 《SQL Server企业级平台管理实践》读书笔记——关于SQL Server数据库的备份方式...
  5. accessibility-service 高版本无法编译_今天我把APP的编译速度缩短了近5倍
  6. 斯坦福 CS228 概率图模型中文讲义 三、实际应用
  7. 06 iOS 关闭侧滑返回
  8. JavaScript 将死?
  9. 基础架构之GitLab
  10. linux整盘远程备份,linux实现自动远程备份(scp+ssh)
  11. Oracle从入门到精通
  12. 基于Javaweb实现进销存管理系统
  13. 基于Spring MVC + Spring + MyBatis的【网上购物系统】
  14. InSAR数据处理软件简介
  15. 笔记本双显卡,NVIDA驱动,Manjaro 双屏
  16. [生存志] 第48节 叔向忧羊舌
  17. Linux编程学习笔记-多进程编程
  18. (附源码)php二手服装网站 毕业设计 201711
  19. Java设计模式及实践
  20. 初窥门径——字典的更好使用方式

热门文章

  1. git常见的回退操作
  2. new/delete与malloc/free的区别与联系详解
  3. float x 与“零值”比较的if语句为?
  4. linux中yum命令详解
  5. HTML中有关表格的基本属性知识
  6. java+JBroFuzz对restful api进行fuzz测试
  7. 我是怎么通过技术白手起家创业的。
  8. mysqldump重叠备份带来的锁表问题
  9. 跟恶意插件的较量:手工清除Orzhz广告程序
  10. 在中小型公司建立企业根证书颁发机构 (CA)