【洛谷p1162】填涂颜色
(今天yy出奇的不活泼,认真的吓人)
算法标签:

思路啊qwq:
part1:
- 想法是先暴搜出每一行的1,取最前方一个1和最后方一个1,然后中间的0填上色,80分,因为没有考虑到“00011100101”这样类似的的情况。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<cmath>
using namespace std;
int n,minx=,miny[],maxx,maxy[];
int a[][],ans[][];
bool vis[][];
int dx[]={,,-,};
int dy[]={,,,-};
struct az{
int x,y;
};
az fz(int x,int y){
az rtn;
rtn.x=x;
rtn.y=y;
return rtn;
}
bool pan(int x,int y){
return x>=&&y>=&&x<=n&&y<=n&&vis[x][y]==;
}
queue<az> q;
void bfs(){
q.push(fz(,));
vis[][]=;
int num=;
while(!q.empty()){
az h=q.front();
q.pop();
for(int i=;i<;i++){
int xx=h.x,yy=h.y;
if(pan(xx+dx[i],yy+dy[i])){
xx+=dx[i];
yy+=dy[i];
if(a[xx][yy]==){
ans[++num][]=xx;
ans[num][]=yy;
if(xx<minx)minx=xx;if(xx>maxx)maxx=xx;
if(yy>maxy[xx])maxy[xx]=yy;
if(yy<miny[xx])miny[xx]=yy;
}
q.push(fz(xx,yy));
vis[xx][yy]=;
}
}
}
for(int i=minx;i<=maxx;i++)
for(int j=miny[i];j<=maxy[i];j++)
if(a[i][j]==)
a[i][j]=;
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
scanf("%d",&a[i][j]);
memset(miny,,sizeof(miny));
bfs();
for(int i=;i<=n;i++){
for(int j=;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
}然后下载了最后一个数据,我做了一个伟大的打表水数据的决定qwq:

- 但是良心不安啊,于是我又想了一个神奇的思路:
- 根据题意,当找到第一个1时,其右下必然是圈内的0,那么只要从这个0开始广搜寻找联通块就可以了。
- 所以就这这个写了一个程序:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<cmath>
using namespace std;
int n,sy,sx;
int a[][];
bool vis[][],b;
int dx[]={,,-,};
int dy[]={,,,-};
bool panduan(int x,int y){ }
struct az{
int x,y;
};
az fz(int x,int y){
az rtn;
rtn.x=x;
rtn.y=y;
return rtn;
}
bool pan(int x,int y){
return x>=&&y>=&&x<=n&&y<=n&&vis[x][y]==;
}
queue<az> q;
void bfs(){
q.push(fz(,));
vis[][]=;
int num=;
while(!q.empty()){
az h=q.front();
q.pop();
for(int i=;i<;i++){
int xx=h.x,yy=h.y;
if(a[xx][yy]==){
sx=xx+;
sy=yy+;
b=;
break;
}
if(pan(xx+dx[i],yy+dy[i])){
xx+=dx[i];
yy+=dy[i];
q.push(fz(xx,yy));
vis[xx][yy]=;
}
}
if(b==)break;
}
queue<az> Q;
Q.push(fz(sx,sy));
a[sx][sy]=;
while(!Q.empty()){
az hh=Q.front();
Q.pop();
for(int i=;i<;i++){
int aa=hh.x,bb=hh.y;
aa+=dx[i];
bb+=dy[i];
if(a[aa][bb]==){
Q.push(fz(aa,bb));
a[aa][bb]=;
} }
}
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
scanf("%d",&a[i][j]);
bfs();
for(int i=;i<=n;i++){
for(int j=;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
}end-
【洛谷p1162】填涂颜色的更多相关文章
- 洛谷 P1162 填涂颜色 DFS
P1162 填涂颜色 https://www.luogu.com.cn/problem/P1162 qaq搜索好抽象啊,蒟蒻表示难以理解,搞半天才做出来一道题,很挫败www 思路 染色法.找墙壁外的连 ...
- 洛谷P1162—填涂颜色
这应该是是第一次记录洛谷题库里的题目吧: 题目描述 由数字00组成的方阵中,有一任意形状闭合圈,闭合圈由数字11构成,围圈时只走上下左右44个方向.现要求把闭合圈内的所有空间都填写成22.例如:6 \ ...
- 洛谷 P1162 填涂颜色
题目链接:https://www.luogu.org/problemnew/show/P1162 题目描述由数字0组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向.现要 ...
- 洛谷 P1162 填涂颜色【DFS】
题目链接:https://www.luogu.org/problemnew/show/P1162 题目描述 由数字 0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字 1 构成,围圈时只走上下左右 4 ...
- 洛谷—— P1162 填涂颜色
https://www.luogu.org/problem/show?pid=1162 题目描述 由数字0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向.现要求把闭 ...
- 洛谷 P1162 填涂颜色题解
题目描述 由数字00组成的方阵中,有一任意形状闭合圈,闭合圈由数字11构成,围圈时只走上下左右44个方向.现要求把闭合圈内的所有空间都填写成22.例如:6 \times 66×6的方阵(n=6n=6) ...
- 洛谷P1162 填涂颜色【bfs】
题目链接:https://www.luogu.org/problemnew/show/P1162 题意: 有一个0和1组成的矩阵,一些1组成一个闭合圈,圈住一些0,现在要把被圈住的这些0变成2输出. ...
- 洛谷P1162 填涂颜色
题目链接:https://www.luogu.org/problemnew/show/P1162 这道题是LITTLESUN写的第一道BFS哦! 对于这道题的的思路是把封闭图形外边的0标记一边,在最后 ...
- 洛谷 - P1162 - 填涂颜色 - 简单搜索
https://www.luogu.org/problemnew/show/P1162 在外面加一圈0把0连起来,然后把所有0换成2,再从(0,0)把连通的2全部改回来. 这也是一个判断内外圈的好办法 ...
- luogu P1162 填涂颜色 x
P1162 填涂颜色 题目描述 由数字0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向.现要求把闭合圈内的所有空间都填写成2.例如:6X6的方阵(n=6),涂色前和 ...
随机推荐
- 【转载】SVN使用教程总结
SVN简介: 为什么要使用SVN? 程序员在编写程序的过程中,每个程序员都会生成很多不同的版本,这就需要程序员有效的管理代码,在需要的时候可以迅速,准确取出相应的版本. Subversion是什么? ...
- 20165305 《网络对抗技术》 Kali安装
一.安装kali 在虚拟机中安装kali我参考了下面的网页,里面写的很全面,所以我就不重复了,我主要说一下kali里面的环境配置. 在虚拟机中安装kali linux 注意:输入用户和密码时,kali ...
- Linux退出状态码
命令成功结束 一般性未知错误 不适合的shell命令 命令不可执行 没找到命令 无效的退出参数 +x 与Linux信号x相关的严重错误 通过Ctrl+C终止的命令 正常范围之外的退出状态码
- Hadoop2-HDFS学习笔记之入门(不含YARN及MR的调度功能)
架构 Hadoop整体由HDFS.YARN.MapReduce三大部分组成,推荐架构参考:https://www.cnblogs.com/zhjh256/p/10573684.html. 注:2.x的 ...
- 强杀apt-get install进程导致错误的修复办法
关闭了一个安装缓慢的apt-get install终端窗口,安装另一个软件,提示打不开var下的一个锁(没加sudo也是这个错误但会提示是非root用户权限不够导致,但这里不是这个问题),说是另一个进 ...
- blogger添加代码高亮
blogger(blogspot)自带的是没有代码高亮的,我们可以用下面的方法添加代码高亮. 首先我们打开blogger(blogspot)后台,然后点击主题背景-->修改html,然后在弹出的 ...
- Linux操作系统的VI命令
Linux操作系统的VI命令 VI是Linux系统的一个文本编辑器,该编辑器可以通过使用VI命令来操作,从而完成对文本的编辑.熟练掌握一些常用的VI命令,可以大大简化编辑操作并提高操作Linux文本的 ...
- 四、ConcurrentHashMap 锁分段机制
回顾: HashMap与Hashtable的底层都是哈希表,但是 HashMap:线程不安全 Hashtable:线程安全,但是效率非常低,且存在[复合操作](如"若存在则删除") ...
- java扫描文件。
前言:一步一步来实现迷你ioc框架,前面的容器工厂也是一个铺垫,这次的扫描文件也是一个铺垫…… 需求:扫描当前项目下所有文件.包括文件夹下文件夹里面的文件.利用递归进行扫描 ScanFileUtil类 ...
- react native 项目使用 expo 二维码扫描失败
今天学习react native,需使用expo在移动端进行调试. npm start 运行项目后,使用expo扫描二维码,始终没有反应.于是决定采用这个方法: 连上手机打开usb调试后,按下‘a’, ...