数据结构实验二:迷宫的求解
Exp02 迷宫的求解
Author: Maskros
实验目的
输入迷宫,得到从入口到出口的(最短)路径
实验内容与要求
迷宫只有两个门,一个叫做入口,另一个叫做出口。把一只老鼠从一个无顶盖的大盒子的入口处赶进迷宫。迷宫中设置很多隔壁,对前进方向形成了多处障碍,在迷宫的唯一出口处放置了一块奶酪,吸引老鼠在迷宫中寻找通路以到达出口。求解迷宫问题,即找出从入口到出口的路径。
实验内容和实验步骤
分别通过深度优先搜索 (dfs) 和广度优先搜索 (bfs) 两种方法来实现实验要求
- 大体思路:
- dfs O(m∗n)O(m*n)O(m∗n)?:
- 结构体
point存储点的信息,maze[][]存图,visit[][]判断是否访问过,dir[4][2]用于存储四个方向,便于查找 stack栈用于存储最终路径s void dfs(int x,int y)函数对坐标进行深度优先搜索,采用递归的思路,顺着一条路猛找,找不到返回上一级结点,直到找到为止。void printpoint()函数用于打印路径void printmaze()函数用于打印地图
- 结构体
- bfs O(m+n)O(m+n)O(m+n)?:
- 结构体
node存储点的信息,其中int l表示从开始到该结点的距离,node father[][]数组用于存储当前节点的上一步是哪个结点,便于输出路径,其余变量同dfs queue用于读入可走的路径,在bfs中使用q bool check(int x,int y)函数用于判断当前结点是否可走int bfs(node s)函数,结束标志为队空,从当前结点依次遍历可走的方向,如果可以继续走就将可走结点入队,如果走到终点即返回最短路径长度string to_string(int s)函数用于将int类型转为string类型,便于输出路径void print()函数根据father[][]从终点逆推打印路径
- 结构体
- dfs O(m∗n)O(m*n)O(m∗n)?:
- 输入形式:首先输出两个正整数 mmm , nnn , 表示迷宫的有 nnn 行 mmm 列,接下来输入迷宫序列,
1表示可以通过,0表示不能通过。 - 输出形式:以 bfs 实现的为例,首先输出最短路长度 lminl_{min}lmin , 接下来以 (xi,xi)(x_i,x_i)(xi,xi) -> $(x_j,y_j) $ … 表示这条路径,最后输出地图,用
*表示走过的路使结果更加直观;没有路径则输出-1
dfs实现(求一条路径)
//presented by Maskros - 2021/04/21
//dfs
#include
using namespace std;
int m,n;
char maze[20][20]; //map
int vis[20][20]={0}; //check if visited
int dir[4][2]={ //four directrions{0,-1},{-1,0},{0,1},{1,0}
};
char ans[20][20];
struct point{ int x,y; //coordinatechar d; //Record directionpoint(){};point(int a,int b,char c):x(a),y(b),d(c){}
}pp;
char check(int x,int xx,int y,int yy){ //Check the direction of the pathif(xx>x) return 'D';if(xxy) return 'R';if(yy s;
void dfs(int x,int y){ //Depth first searchif(x>=m||x<0||y>=n||y<0) return ; //Can't reachif(x==m-1&&y==n-1) {ed=true; return ;} //reach destinationint nx,ny;for(int i=0;i<4;i++){nx=x+dir[i][0];ny=y+dir[i][1];if((nx=0&&ny=0) && vis[nx][ny]==0 && maze[nx][ny]=='1'){vis[nx][ny]=1;dfs(nx,ny);if(ed==true){ s.push(point(nx,ny,check(x,nx,y,ny))); return ; } //Recursive search the path}}
}
void printpoint(){ //Print pathputchar('\n');char dd;bool st=false;while(!s.empty()){pp=s.top();s.pop();if(st) {dd=pp.d; cout<>m>>n;for(int i=0;i>maze[i][j];ans[i][j]=maze[i][j];}if(maze[0][0]=='0'||m==0||n==0||maze[m-1][n-1]=='0'){cout<<"no way";return 0;} else {ans[0][0]='*';vis[0][0]=1;} dfs(0,0);if(ed==false) {cout<<"no way"<
bfs实现(求最短路)
//presented by Maskros - 2021/04/21
//bfs
#include
using namespace std;
int m,n;
char maze[20][20]; //map
int vis[20][20]={0}; //check if visited
struct node{int x,y; //coordinateint l; //Path lengthnode(){}node(int a, int b):x(a),y(b),l(0){}node(int a, int b, int ll):x(a),y(b),l(ll){}
};
node father[20][20]; //The previous node of the current node in the path
queue q; int dir[4][2]={ //four directions{0,-1},{-1,0},{0,1},{1,0}
};
bool check(int x,int y){ //Judge if can goif(x>=0 && x=0 && y "+s;maze[tt.x][tt.y]='*';if(tt.x==0 && tt.y==0) break;tt=father[tt.x][tt.y];}cout<>m>>n;for(int i=0;i>maze[i][j];}}if(!check(0,0)){ cout<<-1; return 0;} //Special caseint lmin=bfs(node(0,0)); //Shortest path lengthif(lmin==-1) cout<<-1;else {cout<
实验用测试数据和相关结果分析
Test 1
5 5
1 1 1 1 1
0 0 0 0 1
1 1 1 1 1
1 0 0 0 0
1 1 1 1 1Test 2
1 1
1Test 3
1 5
1 1 0 1 1Test 4
4 4
1 1 1 0
1 0 1 1
1 1 1 0
1 0 0 1Test 5
9 7
1 1 1 1 1 1 1
0 0 0 0 0 0 1
1 1 1 1 1 1 1
1 0 1 0 0 0 0
1 1 1 1 1 1 1
0 0 0 0 1 0 1
1 0 1 1 1 1 1
1 0 1 0 1 0 1
1 0 1 1 1 0 1
- 结果分析:无论是起点终点重合,没有通路,以及对最短路的寻找均有正确的输出
实验总结
- 分别温习了栈和队列的使用,基于栈通过dfs递归爆搜出一条通路,以及基于队列通过bfs逐渐找到一条最短路径
- 干,时间复杂度有点不会算
- dfs 和 bfs 典中典,stl yyds
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
