当前位置: 首页 > news >正文

编程刷题-染色题DFS

P1162 填涂颜色

题目描述

由数字 000 组成的方阵中,有一任意形状的由数字 111 构成的闭合圈。现要求把闭合圈内的所有空间都填写成 222。例如:6×66\times 66×6 的方阵(n=6n=6n=6),涂色前和涂色后的方阵如下:

如果从某个 000 出发,只向上下左右 444 个方向移动且仅经过其他 000 的情况下,无法到达方阵的边界,就认为这个 000 在闭合圈内。闭合圈不一定是环形的,可以是任意形状,但保证闭合圈内000 是连通的(两两之间可以相互到达)。

0 0 0 0 0 0
0 0 0 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 1 0 1
1 1 1 1 1 1
0 0 0 0 0 0
0 0 0 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 1 2 1
1 1 1 1 1 1

输入格式

每组测试数据第一行一个整数 n(1≤n≤30)n(1 \le n \le 30)n(1n30)

接下来 nnn 行,由 000111 组成的 n×nn \times nn×n 的方阵。

方阵内只有一个闭合圈,圈内至少有一个 000

输出格式

已经填好数字 222 的完整方阵。

输入输出样例 #1

输入 #1

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

输出 #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 1 1

说明/提示

对于 100%100\%100% 的数据,1≤n≤301 \le n \le 301n30

代码

在外围多加一圈0,将没有被1围住的0全部标记为1(利用dfs实现染色标记)。然后遍历,最后标记仍为0的数就是被围在1里面的0。

#include <bits/stdc++.h>
using namespace std;
int a[31][31],b[31][31];
int n;
int dir[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
void dfs(int p,int q){if(p<0||p>n+1||q<0||q>n+1||a[p][q]!=0) return;     //如果越界或有障碍就回溯 a[p][q]=1;for(int i=0;i<4;i++){dfs(p+dir[i][0],q+dir[i][1]);}
}
int main()
{cin>>n;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++){cin>>b[i][j];if(b[i][j]==0)  a[i][j]=0;else a[i][j]=2;}dfs(0,0);for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(a[i][j]==0)cout<<"2 ";else cout<<b[i][j]<<" ";}cout<<endl;}return 0;}

P1506 拯救oibh总部

题目背景

oibh 总部突然被水淹没了!现在需要你的救援……

题目描述

oibh 被突来的洪水淹没了,还好 oibh 总部有在某些重要的地方起一些围墙。用 * 号表示,而一个四面被围墙围住的区域洪水是进不去的。

oibh 总部内部也有许多重要区域,每个重要区域在图中用一个 0 表示。

现在给出 oibh 的围墙建设图,问有多少个没被洪水淹到的重要区域。

输入格式

第一行为两个正整数 x,yx,yx,y

接下来 xxx 行,每行 yyy 个字符,由 *0 组成,表示 oibh 总部的建设图。

输出格式

输出没被水淹没的 oibh 总部的 0 的数量。

输入输出样例 #1

输入 #1

4 5
00000
00*00
0*0*0
00*00

输出 #1

1

输入输出样例 #2

输入 #2

5 5
*****
*0*0*
**0**
*0*0*
*****

输出 #2

5

说明/提示

对于 100%100\%100% 的数据,1≤x,y≤5001 \le x,y \le 5001x,y500

这道题与前面的“填涂颜色”一样,也是一道染色题。
参考题解:https://www.luogu.com.cn/article/q5h0hznk

解法1-同上题

#include <bits/stdc++.h>
using namespace std;
int n,m,ans;
char c;
int a[505][505];
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
void dfs(int x,int y){if(x<0||y<0||x>n+1||y>m+1||a[x][y]) return; //遇到已经标记的外部0或者遇到障碍就结束 这里是在外围加了一圈0,为了防止输入2类似的情况,避免一上来就遇到障碍被卡死a[x][y]=1;for(int i=0;i<4;i++)dfs(x+dir[i][0],y+dir[i][1]);
}
int main(){cin>>n>>m;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>c;if(c=='0') a[i][j]=0;else a[i][j]=1;}}dfs(0,0);for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(a[i][j]==0)  ans++;}    }cout<<ans<<endl;return 0;
}

解法2-不用填充外围的0

#include<bits/stdc++.h>
using namespace std;
int n,m,s=0;
int kx[5]={0,1,-1,0,0}; 
int ky[5]={0,0,0,1,-1};
int a[501][501];
void search(int x,int y){a[x][y]=1;//先标记被淹没了 for(int i=1;i<=4;i++){//向四个方向搜索 int x0=x+kx[i];int y0=y+ky[i];if(x0>0&&x0<=n&&y0>0&&y0<=m&&a[x0][y0]==0)search(x0,y0);}//如果新的数在整个数组范围内并且不是障碍(能走),那么就搜索从这个格子能走到其他哪些格子 
}
int main(){cin>>n>>m;char e;for(int i=1;i<=n;i++){//输入 for(int j=1;j<=m;j++){cin>>e;if(e=='*')a[i][j]=1;//如果是障碍就输入1 else a[i][j]=0;//可以过就是0 }}for(int i=1;i<=n;i++){//搜索第一列和最后一列的格子 if(a[i][1]==0)search(i,1);//如果有能过的就搜索 if(a[i][m]==0)search(i,m);}for(int i=1;i<=m;i++){//搜索第一行和最后一行的格子 if(a[1][i]==0)search(1,i);if(a[n][i]==0)search(n,i);}for(int i=1;i<=n;i++){//最后搜索没有被淹的格子 for(int j=1;j<=m;j++){if(a[i][j]==0)s++;}}cout<<s;//输出 return 0;
}
http://www.dtcms.com/a/347380.html

相关文章:

  • 03_数据结构
  • 在 CentOS 7 上搭建 OpenTenBase 集群:从源码到生产环境的全流程指南
  • MSPM0G3507工程模板创建
  • 微信小程序自定义组件开发(上):从创建到数据通信详解(五)
  • 纠删码技术,更省钱的分布式系统的可靠性技术
  • 使用springboot开发-AI智能体平台管理系统,统一管理各个平台的智能体并让智能体和AI语音设备通信,做一个属于自己的小艾同学~
  • Dubbo vs Feign
  • 个人思考与发展
  • 探秘北斗卫星导航系统(BDS):架构、应用与未来蓝图,展现中国力量
  • 详细说一说JIT
  • Redis面试精讲 Day 28:Redis云原生部署与Kubernetes集成
  • Js逆向 拼夕夕anti_content
  • 深入解析Spring Boot自动配置原理:简化开发的魔法引擎
  • Java基础第2天总结
  • 青少年机器人技术(四级)等级考试试卷-实操题(2021年12月)
  • 互联网大厂Java面试实战:核心技术栈与场景化提问解析(含Spring Boot、微服务、测试框架等)
  • Java 遗传算法在中药药对挖掘中的深度应用与优化策略
  • 雨雾天气漏检率骤降80%!陌讯多模态车牌识别方案实战解析
  • Redis--day10--黑马点评--秒杀优化消息队列
  • 【JavaEE】多线程 -- JUC常见类和线程安全的集合类
  • 什么猫粮好?2025最新猫粮排名合集
  • 深度解析Bitmap、RoaringBitmap 的原理和区别
  • MySql知识梳理之DDL语句
  • TypeScript 类型系统入门:从概念到实战
  • 从零开始学习JavaWeb-16
  • 阿德莱德多模态大模型导航能力挑战赛!NavBench:多模态大语言模型在具身导航中的能力探索
  • Mysql InnoDB 底层架构设计、功能、原理、源码系列合集【六、架构全景图与最佳实践】
  • 新能源汽车热管理仿真:蒙特卡洛助力神经网络训练
  • android studio配置 build
  • XCVU13P-2FHGB2104E Xilinx(AMD)Virtex UltraScale+ FPGA