BFS示例代码

#include<iostream>
#include<cstdio>

using namespace std;

#define MAXN 55

const int d[][2]={{1,0},{0,-1},{0,1}};//题目的坐标偏移量 

struct Node//结构体保存节点信息 
{
	int x,y,step;
	Node(){}
	Node(int a,int b,int c):x(a),y(b),step(c){}
}que[MAXN*MAXN];//队列 

int n,m;//地图大小 

bool vis[MAXN][MAXN];//HASH 判重表 

char map[MAXN][MAXN];//地图信息 

int bfs() 
{
	int h,t;
	for(int i=0;i<n;i++)
	for(int j=0;j<m;j++) vis[i][j]=false;
	vis[0][0]=true;
	que[h=t=0]=Node(0,0,0);//起点放入队列 
	while(h<=t)//如果队列不为空 
	{
		int x=que[h].x,y=que[h].y,step=que[h++].step;
		if(x==n-1 && y==m-1) return step;//找到目标点 
		for(int i=0;i<3;i++)
		{
			int tx=x+d[i][0],ty=y+d[i][1];
			if(tx>=n || tx<0 || ty>=m || ty<0) continue;
			if(map[tx][ty]=='*' || vis[tx][ty]) continue;
			//以上两句判断当前扩展的点是否合法 
			vis[tx][ty]=true;//标记该状态已经生成过 
			que[++t]=Node(tx,ty,step+1);//新状态放入队列 
		}
	}
	return -1;//未找到目标点 
}

int main()
{
	while(cin>>n>>m)
	{
		int i,j;
		for(i=0;i<n;i++) scanf("%s",map[i]);
		cout<<bfs()<<endl;
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值