迷宫问题求解

迷宫问题求解


对于迷宫问题的求解,我们最后输出的是迷宫的路径,故符合队列的先进先出特性,所以我们采用队列的方式对迷宫进行求解

首先我们将建立一个二维数组


//自定义初始化迷宫 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 ;
}

结果图

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值