咸鱼翻身之路——迷宫问题

剧情接上篇博客
《咸鱼翻身之路——迷宫问题》
打完八皇后之后,我走着六亲不认的步子准备回去领技能点(不充钱有技能点你也是不会变强的),但在这时,我突然发现我迷路了。。。完了啊,没大佬和队友帮我我可咋出去啊,愁死我了,但幻想了一下我以后翻身当大佬的情形,我:不行,我要出去,我还没翻身呢,我还没装过X呢,不能凉在这个鬼地方!!
于是我就好好研究了一下走出迷宫的方法

迷宫问题描述:

定义一个二维数组:

int maze[5][5] = {

0, 1, 0, 0, 0,

0, 1, 0, 1, 0,

0, 0, 0, 0, 0,

0, 1, 1, 1, 0,

0, 0, 0, 1, 0,

};

它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

输入

一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。

输出

左上角到右下角的最短路径,格式如样例所示。

样例输入

0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

样例输出

(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)

第一次我尝试用bfs走出迷宫,但到后面就开始瞎跑了,最后还是解决不了这个问题

#include<bits/stdc++.h>
using namespace std;
struct fuck
{
	int x,y;
	int p,q;
}que[1000];
int a[100][100],book[100][100];
int main()
{
	int tx,ty;
	int next[4][2]={ {0,1},
					 {1,0},	
					 {0,-1},	
					 {-1,0} };
	int head=1,tail=1;
	for(int i=1;i<=5;i++)
		for(int j=1;j<=5;j++)
			scanf("%d",&a[i][j]);
	que[tail].x=1;
	que[tail].y=1;
	que[tail].p=1;
	que[tail].q=1;
	tail++;
	book[1][1]=1;
	int flag=0;
	while(head<tail){
		for(int k=0;k<=3;k++){
			tx=que[head].x+next[k][0];
			ty=que[head].y+next[k][1];
			if(tx<1||tx>5||ty<1||ty>5)
				continue;
			if(a[tx][ty]==0&&book[tx][ty]==0){
				book[tx][ty]=1;
				
				que[tail].x=tx;
				que[tail].y=ty;
				
				que[tail].p=tx;
				que[tail].q=ty;
				
				tail++;
			}
			if(tx==5&&ty==5){
				flag=1;
				break;
			}
		}
		if(flag==1)
			break;
		head++;
	}
	for(int i=1;i<=tail-1;i++)
		cout<<"("<<que[i].p<<","<<que[i].q<<")"<<endl;
}

因为单纯的bfs只能找到出迷宫最少用多少步,而无法找到最优路径的,并且会出现瞎跑的情况,显得非常zz,所以我又研究了好久,找到了一个比较简单的方法来走出迷宫

#include<iostream>
#include<cstdio> 
using namespace std;
int a[100][100],book[100][100],sum,p[100],q[100],e[100],r[100];//定义了e,r两个数组来保存走过的最短路径
int small=9999;
void dfs(int x,int y,int step)
{
	int next[4][2]={ {0,1}, //表示走的方向
					 {1,0},	
					 {0,-1},	
					 {-1,0} };
	int tx,ty;
	if(x==5&&y==5){ //判断是否走到迷宫出口
		if(step<small){ //更新最短距离
			small=step;//更新最短路径
			for(int i=0;i<=small;i++){// 
				e[i]=p[i];
				r[i]=q[i];
			} 
		} 
		return;
	}
	for(int k=0;k<=3;k++){//枚举上下左右四种情况
		tx=x+next[k][0];
		ty=y+next[k][1];
		if(tx<1||tx>5||ty<1||ty>5)
			continue;
		if(a[tx][ty]==0&&book[tx][ty]==0){//判断是否能向下继续搜索
			book[tx][ty]=1;//标记这个点,防止下面重复
			p[step]=tx;//记录走的路径
			q[step]=ty;
			dfs(tx,ty,step+1);//继续向下搜索
			book[tx][ty]=0;//取消标记
			p[step]=0;
			q[step]=0;
		}
	}
	return;
}
int main()
{
	for(int i=1;i<=5;i++)
		for(int j=1;j<=5;j++)
			scanf("%d",&a[i][j]);//输入迷宫
	book[1][1]=1;//标记起点
	dfs(1,1,0);//搜索开始
	cout<<"("<<0<<", "<<0<<")"<<endl;//输出起点位置
	for(int i=0;i<small;i++)//输出走过的最短路径
		cout<<"("<<e[i]-1<<", "<<r[i]-1<<")"<<endl;
} 

因为我对dfs比较熟悉,所以我尝试了用dfs把每条能走出迷宫的路都找到,然后找出最短的那条路,再输出路径,这个方法虽然说简单,但迷宫很大的话可能就会超时,不过还好这个迷宫不算很大,不然我就真的要凉到里面了(虽然现在我也挺凉的)

题外话:
这是我第一次在没有大佬和队友帮助的情况下独立完成的一道题,对我来说不仅仅是一种收获,更是值得纪念的一件事吧,但距离我翻身还有很长的一段路要走,所以这只能算是一个小插曲,没什么值得高兴的(我是咸鱼的事实还是不会改变的),以后我还是会继续朝着翻身的目标努力的!!

    原文作者:迷宫问题
    原文地址: https://blog.csdn.net/qq_44039966/article/details/85019996
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞