【BFS】电子老鼠闯迷宫

Description

如下图12×12方格图,找出一条自入口(2,9)到出口(11,8)的最短路径。
在这里插入图片描述

Sample Input

12 //迷宫大小
2 9 11 8 //起点和终点
1 1 1 1 1 1 1 1 1 1 1 1 //邻接矩阵,0表示通,1表示不通
1 0 0 0 0 0 0 1 0 1 1 1
1 0 1 0 1 1 0 0 0 0 0 1
1 0 1 0 1 1 0 1 1 1 0 1
1 0 1 0 0 0 0 0 1 0 0 1
1 0 1 0 1 1 1 1 1 1 1 1
1 0 0 0 1 0 1 0 0 0 0 1
1 0 1 1 1 0 0 0 1 1 1 1
1 0 0 0 0 0 1 0 0 0 0 1
1 1 1 0 1 1 1 1 0 1 0 1
1 1 1 1 1 1 1 0 0 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1

Sample Output

(2,9)->(3,9)->(3,8)->(3,7)->(4,7)->(5,7)->(5,6)->(5,5)->(5,4)->(6,4)->(7,4)->(7,3)->(7,2)->(8,2)->(9,2)->(9,3)->(9,4)->(9,5)->(9,6)->(8,6)->(8,7)->(8,8)->(9,8)->(9,9)->(10,9)->(11,9)->(11,8)
27


解题思路

板子广搜
在这里插入图片描述

(没有思路,只有注释)


#include<iostream>
#include<cstdio>
using namespace std;
const int w[4][2]={{1,0},{0,-1},{-1,0},{0,1}};
int a[200][200],f[200][200][2],s[200][200];//f用来存父亲的横,竖坐标;a记录走没走过;s记录步数
int v[100100][2],h,t=1;
int n,sx,sy,ex,ey;
bool check(int x,int y){//判断x,y在不在迷宫范围内
	return (x>0&&x<=n&&y>0&&y<=n);
}
void bfs(int x,int y){
	a[x][y]=s[x][y]=1;//标记第一个点
	v[t][0]=x,v[t][1]=y;
	while(h++<t){
		for(int i=0;i<4;i++){
			int xx=v[h][0]+w[i][0],yy=v[h][1]+w[i][1];
			if(check(xx,yy)&&!a[xx][yy]){
				| a[xx][yy]=1;                      |
				| s[xx][yy]=s[v[h][0]][v[h][1]]+1;  |//广搜的维护处理
				| v[++t][0]=xx,v[t][1]=yy;          | 
				f[xx][yy][0]=v[h][0],f[xx][yy][1]=v[h][1]; //记录路径
				if(xx==ex&&yy==ey)return;//找到直接退出
			}
		}
	}
}
void print(int x,int y){//递归输出路径
	if(x!=sx||y!=sy)
	   print(f[x][y][0],f[x][y][1]);
	 else{
	 	printf("(%d,%d)",x,y);
	 	return;
	 }
	printf("->(%d,%d)",x,y);       
}
int main(){
	scanf("%d",&n);
	scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
	for(int i=1;i<=n;i++)
	    for(int j=1;j<=n;j++)
		    scanf("%d",&a[i][j]);
	bfs(sx,sy); 
	print(ex,ey);
	printf("\n%d",s[ex][ey]);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值