P1451的题解
当然,这道题不是我出的题目 (滑稽保命
一、审题
首先,我们看看,这道题是让我们求连在一起数字大于0的部分的数量
二、想思路
这道题是一道搜索题(废话),我喜欢用dfs的暴搜(真香)。
当然,肯定要用FloodFill的方法(至于这个FloodFill,请自行百度)
我猜你不会这个东西也不去查,算了,我给你链接吧
那就让我们开始吧~
三、代码&讲解
1、必要的东西
让我们打上心爱的头文件、命名空间和主函数
#include<cstdio>
int main()
{
return 0;
}
2、定义
定义的话我是推荐大家用题目提供的名字来定义
int n;
int m;
int g[100][100]; //存储每个位置的信息
bool vis[100][100]; //用来标记
int _next[4][2]={{0,1}, //用来计算下一步的坐标
{1,0},
{0,-1},
{-1,0}};
3、输入
输入的话我就不说了,但这里要注意,题目提供的是字符,所以还是用字符来存信息,再转成数字存进数组g里面
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++) for(int j=0;j<m;j++)
{
scanf(" %c",&key); //注意这里要有空格,否则会读入'\n'
map[i][j]=ch_in(key);
//ch_in是将字符转换成数字,具体怎么实现,希望大家想自己想一下再看我的实现方法
//ch_in的写法我将会在最后的完整程序给大家展示
}
4.dfs
这里是程序最关键的部分
void dfs(int x,int y,int colour) //colour来涂色
{
int tx,ty;
map[x][y]=colour;//涂色
book[x][y]=1;//进来先标记
for(int i=0;i<4;i++) //尝试每一种可能
{
tx=x+_next[i][0];
ty=y+_next[i][1];
if(tx<0||ty<0||tx>n||ty>m) continue; //判断边界
if(map[tx][ty]>0&&!book[tx][ty])
dfs(tx,ty,colour); //递归
}
book[x][y]=0; //取消标记
return ;
}
5.调用dfs
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
if(map[i][j]>0) //如果遇到没有涂色的细胞
{
sum++; //数量+1
dfs(i,j,0); //调用,填涂的颜色为0
}
}
6.输出
这个的话我就不说了
printf("%d",sum);
7.完整代码
#include<cstdio>
int n,m;
int map[100][100];
int book[100][100];
int _next[4][2]={{0,1},
{1,0},
{0,-1},
{-1,0}};
char key;
int sum;
int ch_in(char ch)
{
int p=ch-'0';
return p;
}
void dfs(int x,int y,int colour) //colour来涂色
{
int tx,ty;
map[x][y]=colour;//涂色
book[x][y]=1;//进来先标记
for(int i=0;i<4;i++) //尝试每一种可能
{
tx=x+_next[i][0];
ty=y+_next[i][1];
if(tx<0||ty<0||tx>n||ty>m) continue; //判断边界
if(map[tx][ty]>0&&!book[tx][ty])
dfs(tx,ty,colour); //递归
}
book[x][y]=0; //取消标记
return ;
}
int main()
{
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++) for(int j=0;j<m;j++)
{
scanf(" %c",&key);
map[i][j]=ch_in(key);
}
for(int i=0;i<n;i++) for(int j=0;j<m;j++)
{
if(map[i][j]>0)
{
sum++;
book[i][j]=1;
dfs(i,j,0);
}
}
printf("%d",sum);
return 0;
}
四、最后
最后,看我这么努力,留下一个赞和大大的喜欢再走吧QwQ
See you guys,bye bye~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?