博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷P1162 填涂颜色
阅读量:5037 次
发布时间:2019-06-12

本文共 2449 字,大约阅读时间需要 8 分钟。

题目链接:

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

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

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

AC代码如下:

#include
#include
#include
#include
#include
#include
#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
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<

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

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

代码如下:

#include
#include
#include
#include
#include
#include
#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
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<

 

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

你可能感兴趣的文章
python中数据的变量和字符串的常用使用方法
查看>>
等价类划分进阶篇
查看>>
delphi.指针.PChar
查看>>
Objective - C基础: 第四天 - 10.SEL类型的基本认识
查看>>
java 字符串转json,json转对象等等...
查看>>
极客前端部分题目收集【索引】
查看>>
第四天 selenium的安装及使用
查看>>
关于js的设计模式(简单工厂模式,构造函数模式,原型模式,混合模式,动态模式)...
查看>>
KMPnext数组循环节理解 HDU1358
查看>>
android调试debug快捷键
查看>>
【读书笔记】《HTTP权威指南》:Web Hosting
查看>>
Inoodb 存储引擎
查看>>
数据结构之查找算法总结笔记
查看>>
Linux内核OOM机制的详细分析
查看>>
Android TextView加上阴影效果
查看>>
Requests库的基本使用
查看>>
C#:System.Array简单使用
查看>>
C#inSSIDer强大的wifi无线热点信号扫描器源码
查看>>
「Foundation」集合
查看>>
算法时间复杂度
查看>>