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~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值