迷宫问题 bfs

在这里插入图片描述
在这里插入图片描述
(规定从右下左上的顺时针方向搜),如下,现在把起点的方向都扩展完了
在这里插入图片描述
此时将队首节点出队
在这里插入图片描述
然后再找队首的可扩展点 扩展到(2,2)然后将无法扩展的队首出列
在这里插入图片描述

#includebits/stdc++.h
using namespace std;
int a【100】【100;//a【i】【j】=1表示是空地可以走,为0表示不是空地
int v【100】【100;//v【i】【j】=1表示已经被访问了,为0表示未被访问
struct point{
	int x;
	int y;
	int step;//步数
};
queue<point> r;//申请队列

int dx【4={0,1,0,-1}; //left;down;right;up
int dy【4={1,0,-1,0};
int main() {
	//input
	**/*
5 4 
	1 1 2 1 
	1 1 1 1
	1 1 2 1 
	1 2 1 1 
	1 1 1 2
1 1 4 3
*/**
	int n,m,startx,starty,p,q;
	scanf(%d%d,&n,&m);
	for(int i=1;i=n;i++){
		for(int j=1;j=m;j++){
			scanf(%d,&a【i】【j】);
		}
	}
	scanf(%d%d%d%d,&startx,&starty,&p,&q);
	//(startx,starty)起点坐标
	//(p,q)终点坐标

	//BFS
	point start;//定义一个结构体类型作为起点
	//初始化开始 
	start.x = startx;
	start.y = starty;
	start.step = 0;
	//初始化结束
	r.push(start);//将起点入队 
	v【startx】【starty】 = 1 ;//设置为已经访问 v为记录该点是否访问过的数组
	
	int flag = 0;
	while(!r.empty()){//当r不为空的时候 就对队列进行扩展

		if(x==p && y==q){// 到达终点
			flag = 1;//到达终点了就把flag设为1
			coutr.front().step;
			break;
		}
		//取出队首元素
		int x = r.front().x;
		int y = r.front().y;
		
		for(int k = 0 ; k<3 ; k++){//四个方向
			int tx,ty;
			tx = x + dx【k】;
			ty = y + dy【k】;
			if (a【tx】【ty】==1 && v【tx】【ty】==0){//如果是空地 并且 未被访问过 
				//入队
				point temp;//把拓展的点放到temp里
				temp.x = tx;
				temp.y = ty;
				temp.step = r.front().step + 1 ;
				r.push(temp);
				v【tx】【ty】 = 1; //设置为已访问 
			}		
		}
		r.pop();//拓展完了需要将队首元素出队

	}
	if(flag==0)//没找到 
	cout<<"no answer"; 
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值