【BFS】电子老鼠闯迷宫

题目:

如下图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  
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

思路:

bfs模板题,只要有路就搜下去撞到墙走回来继续搜,直到搜完为止。


代码:

#include<iostream>
#include<cstdio>
using namespace std;

const int N = 25;
const int dx[5]={0,0,-1,0,1};
const int dy[5]={0,-1,0,1,0};
int a[N][N];
int fa[N*N];
int st[N*N][3];
int px,py,qx,qy,n,last,s=0;
void init()
{
	scanf("%d",&n);
	scanf("%d%d%d%d",&px,&py,&qx,&qy);
	for(int i=1;i<=n;i++)
	  for(int j=1;j<=n;j++)
	    scanf("%d",&a[i][j]);
}
bool check(int x,int y)//边界
{
	if(x>0&&x<=n&&y>0&&y<=n)
	  if (a[x][y]==0) return 1;
	return 0;
}

void print(int x)//输出
{
	if (x==0) return;
	s++;
	print(fa[x]);
	if (x!=last)
		printf("(%d,%d)->",st[x][1],st[x][2]);
	else 
	 	printf("(%d,%d)\n",st[x][1],st[x][2]);  
}
void bfs() {//基本bfs
	int head=0,tail=1;
	st[1][1]=px; st[1][2]=py;
	fa[1]=0;
	do {
		head++;
	for(int k=1;k<=4;k++) {//前后左右
	if(check(st[head][1]+dx[k],st[head][2]+dy[k])) {//判断越界
	tail++;
	fa[tail]=head;
	st[tail][1]=st[head][1]+dx[k];//搜
    st[tail][2]=st[head][2]+dy[k];
	a[st[tail][1]][st[tail][2]]=1;
	if(st[tail][1]==qx && st[tail][2]==qy) {
	last=tail;
	print(tail);
	cout<<s<<endl;
	tail=0;
	return ;
				}
			}
		}
	}while(head<tail);
}
int main() 
{
    init();//调用
    bfs();//调用
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值