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

本文共 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

你可能感兴趣的文章
【干货】界面控件DevExtreme视频教程大汇总!
查看>>
Java小细节
查看>>
洛谷 P2486 BZOJ 2243 [SDOI2011]染色
查看>>
数值积分中的辛普森方法及其误差估计
查看>>
Web service (一) 原理和项目开发实战
查看>>
跑带宽度多少合适_跑步机选购跑带要多宽,你的身体早就告诉你了
查看>>
Javascript异步数据的同步处理方法
查看>>
iis6 zencart1.39 伪静态规则
查看>>
SQL Server代理(3/12):代理警报和操作员
查看>>
Linux备份ifcfg-eth0文件导致的网络故障问题
查看>>
2018年尾总结——稳中成长
查看>>
通过jsp请求Servlet来操作HBASE
查看>>
Shell编程基础
查看>>
Shell之Sed常用用法
查看>>
Centos下基于Hadoop安装Spark(分布式)
查看>>
mysql开启binlog
查看>>
设置Eclipse编码方式
查看>>
分布式系统唯一ID生成方案汇总【转】
查看>>
并查集hdu1232
查看>>
Mysql 监视工具
查看>>