【BFS】电子老鼠闯迷宫

时间限制:1000MS内存限制:256000KB

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

这里写图片描述

输入
第一行为一个数n,表示迷宫大小
第二行为4个数,表示起点和终点
第三起为n*n的矩阵,0表示通路,1表示墙。

输出
第一行为路径(见样例)
第二行为总的步数

输入:
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

输出:
(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

我的思路:
直接广搜,搜到结果为止

C++代码

#include<iostream>
#include<cstdio>
using namespace std;
int n,x,y,l,r;
const int dx[4]={0,0,1,-1};
const int dy[4]={1,-1,0,0};//四个方向
int a[1001][1001];//存储地图与存储步数
int wah[2001][4];
bool check(int x,int y)//判断出界
{
	if(x<0 || y<0 || x>n || y>n)return 0;
	if(a[x][y])return 0;
	return 1; 
}
void out(int k)//输出
{
	if(k!=0)out(wah[k][3]);
	else return;
	printf("(%d,%d)->",wah[k][1],wah[k][2]);
}
int main()
{
	scanf("%d",&n);
	scanf("%d%d%d%d",&x,&y,&l,&r);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
			scanf("%d",&a[i][j]);
	}//读入
	a[x][y]=1;//定义初始值
	wah[1][1]=x;
	wah[1][2]=y;
	int head=1,tail=1;//头与尾
	while(head<=tail)
	{
		for(int i=0;i<4;i++)
			if(check(wah[head][1]+dx[i],wah[head][2]+dy[i]))
			{
				tail++;
				a[wah[head][1]+dx[i]][wah[head][2]+dy[i]]=a[wah[head][1]][wah[head][2]]+1;
				wah[tail][1]=wah[head][1]+dx[i];
				wah[tail][2]=wah[head][2]+dy[i];
				wah[tail][3]=head;
				if(wah[tail][1]==l && wah[tail][2]==r)//看一下是否走到了终点
				{
					out(wah[tail][3]);//输出路径
					printf("(%d,%d)",wah[tail][1],wah[tail][2]);//输出路径
					printf("\n%d",a[l][r]);//输出总步数
					return 0;
				}
			}
		head++;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值