迷宫问题求解
对于迷宫问题的求解,我们最后输出的是迷宫的路径,故符合队列的先进先出特性,所以我们采用队列的方式对迷宫进行求解
首先我们将建立一个二维数组
//自定义初始化迷宫 7 * 7
int arr[n][n] = {
0 , 0 , 0 , 0 , 0 , 0 , 0 ,
0 , 1 , 0 , 1 , 1 , 1 , 0 ,
0 , 1 , 0 , 1 , 0 , 1 , 0 ,
0 , 1 , 0 , 1 , 0 , 1 , 0 ,
0 , 1 , 0 , 1 , 0 , 1 , 0 ,
0 , 1 , 1 , 1 , 0 , 1 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 0
} ;
二维数组边界用0填充,使之区域封闭,在实现过程中出现数组越界问题
接下来是代码
#include<iostream>
#include<cstdlib>
#define n 7
#define max 1000
//队列
using namespace std ;
//自定义初始化迷宫 7 * 7
int arr[n][n] = {
0 , 0 , 0 , 0 , 0 , 0 , 0 ,
0 , 1 , 0 , 1 , 1 , 1 , 0 ,
0 , 1 , 0 , 1 , 0 , 1 , 0 ,
0 , 1 , 0 , 1 , 0 , 1 , 0 ,
0 , 1 , 0 , 1 , 0 , 1 , 0 ,
0 , 1 , 1 , 1 , 0 , 1 , 0 ,
0 , 0 , 0 , 0 , 0 , 0 , 0
} ;
typedef struct {
int x ;
int y ;
int di ; //指向方向
} box ;
typedef struct {
int top ;
box data[max] ;
} que;
void goQue(int x , int y , int x1 , int y1) {
int i , j , k , di , find = 0 ;
//初始化队列
que p ;
p.top = -1 ;
p.top ++ ;
p.data[p.top].x = x ;
p.data[p.top].y = y ;
p.data[p.top].di = -1 ;
arr[x][y] = -1 ; //防止重复行走
//初始化完毕
while(p.top > -1) {
i = p.data[p.top].x ;
j = p.data[p.top].y ;
di = p.data[p.top].di ;
if(i == x1 && j == y1) {
cout << "找到迷宫出口:" << endl ;
for(k = 0 ; k <= p.top ; k ++) {
cout << p.data[k].x << "," << p.data[k].y << " " ;
if((k + 1) % 5 == 0)
cout << endl ;
}
return ;
}
find = 0 ;
while(find == 0 && di < 4) {
di ++ ;
switch(di) {
case 0 :
i = p.data[p.top].x - 1 ;
j = p.data[p.top].y ;
break ;
case 1 :
i = p.data[p.top].x ;
j = p.data[p.top].y + 1 ;
break ;
case 2 :
i = p.data[p.top].x + 1 ;
j = p.data[p.top].y ;
break ;
case 3 :
i = p.data[p.top].x ;
j = p.data[p.top].y - 1 ;
break ;
}
if(arr[i][j] == 1)
find = 1 ; //讲find置1跳出循环
}
if(find == 1) { //道路可通
//方向填入
p.data[p.top].di = di ;
p.top ++ ;
p.data[p.top].x = i ;
p.data[p.top].y = j ;
p.data[p.top].di = -1 ; //初始化方向
arr[i][j] = -1 ; //防止重复行走
} else { //无路可走,退路
//先封路
arr[p.data[p.top].x][p.data[p.top].y] = 0 ;
//然后后退
p.top -- ;
}
}
}
int main() {
goQue(1 , 1 , 5 , 5) ;
return 0 ;
}