细胞bfs&&dfs练习

一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数。如:

阵列

4 10
0234500067
1034560500
2045600671
0000000089
有4个细胞。

【输入】
第一行为矩阵的行n和列m;

下面为一个n×m的矩阵。

【输出】
细胞个数。

【输入样例】
4 10
0234500067
1034560500
2045600671
0000000089
【输出样例】
4

# include<iostream>
# include<cstdio>
# include<cstring>
# include<queue>
using namespace std;
const int maxn=100;
char maze[maxn][maxn];
struct point{
	int x,y;
};
int vis[maxn][maxn];
int n,m;
queue<point> s;
/*void dfs(int x,int y,int cnt)
{
	if(x<0||x>=n||y<0||y>=m)
	   return ;
	if(vis[x][y]>0||maze[x][y]=='0')
	       return ;
	   vis[x][y]=cnt;
	   if(x+1<n&&maze[x+1][y])   
	      dfs(x+1,y,cnt);
	    if(y+1<m&&maze[x][y+1])   
	      dfs(x,y+1,cnt);
	    if(x-1>=0&&maze[x-1][y])   
	      dfs(x-1,y,cnt);
	    if(y-1>=0&&maze[x][y-1])   
	      dfs(x,y-1,cnt);
}*/
void bfs(int x,int y,int cnt)
{
	point w;
	w.x=x;
	w.y=y;
	vis[x][y]=cnt;
	s.push(w);
	while(!s.empty())
	{
		point p=s.front();
		s.pop();
		if(p.x+1<n&&!vis[p.x+1][p.y]&&maze[p.x+1][p.y]!='0')
		  {
		  	point yy;
		  	yy.x=p.x+1;
		  	yy.y=p.y;
		  	vis[yy.x][yy.y]=cnt;
		  	s.push(yy);
		  }
		  if(p.y+1<m&&!vis[p.x][p.y+1]&&maze[p.x][p.y+1]!='0')
		  {
		  	point yy;
		  	yy.x=p.x;
		  	yy.y=p.y+1;
		  	vis[yy.x][yy.y]=cnt;
		  	s.push(yy);
		  }
		  if(p.y-1>=0&&!vis[p.x][p.y-1]&&maze[p.x][p.y-1]!='0')
		  {
		  	point yy;
		  	yy.x=p.x;
		  	yy.y=p.y-1;
		  	vis[yy.x][yy.y]=cnt;
		  	s.push(yy);
		  }
		  if(p.x-1>=0&&!vis[p.x-1][p.y]&&maze[p.x-1][p.y]!='0')
	  {
		  	point yy;
		  	yy.x=p.x-1;
		  	yy.y=p.y;
		  	vis[yy.x][yy.y]=cnt;
		  	s.push(yy);
		  }
	}
	
}
int main()
{
   int cnt=0;
	cin>>n>>m;
	for(int i=0;i<n;i++)
	    cin>>maze[i];
   memset(vis,0,sizeof(vis));
	for(int i=0;i<n;i++)
	 {
	 for(int j=0;j<m;j++)
	   {
	     if(!vis[i][j]&&maze[i][j]!='0') {
	     	//dfs(i,j,++cnt);
	     	bfs(i,j,++cnt);
		    }
		 }
	}
      cout<<cnt<<endl;
	return 0;
 } 

总结:
(1)注意边界的讨论.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值