用递归函数求出迷宫所有解

墙元素值为0,可通过路径为-1,通过路径为足迹。输入格式为X,Y,中间有逗号。依次试探东南西北四个方向


#include <cstdio>

using namespace std;

struct PosType/*迷宫坐标位置类型*/
{
	int x;/*行值*/
	int y;/*列值*/
};
#define MAXLENGTH 25/*设迷宫的最大行列为25*/
typedef int MazeType[MAXLENGTH][MAXLENGTH];/*[行][列]*/
/*全局变量*/
struct PosType end;/*迷宫终点位置*/
MazeType m;/*迷宫数组*/
int x,y;/*迷宫行数,列数*/
/*定义墙元素值为0,可通过路径为-1,通过路径为足迹*/
void Print(int x,int y)
{/*输出解*/
	int i,j;
	for(i=0;i<x;i++)
	{
		for(j=0;j<y;j++)printf("%3d",m[i][j]);
		printf("\n");
	}
	printf("\n");
}
void Try(struct PosType cur,int curstep)
{/*由当前位置cur、当前步骤curstep试探下一点*/
	int i;
	struct PosType next;/*下一个位置*/
	struct PosType direc[4]={{0,1},{1,0},{0,-1},{-1,0}};
	/*{行增量,列增量}*//*移动方向,依次为东南西北*/
	for(i=0;i<=3;i++)/*依次试探东南西北四个方向*/
	{
		next.x=cur.x+direc[i].x;next.y=cur.y+direc[i].y;
		if(m[next.x][next.y]==-1)/*是通路*/
		{
			m[next.x][next.y]=++curstep;
			if(next.x!=end.x||next.y!=end.y)/*没到终点*/
				Try(next,curstep);/*试探下一点(递归调用)*/
			else
				Print(x,y);/*输出结果*/
			m[next.x][next.y]=-1;/*恢复为通路,试探下一条路*/
			curstep--;
		}
	}
}
int main(){
	struct PosType begin;
	int i,j,x1,y1;
	printf("请输入迷宫的行数,列数(包括外墙):");
	scanf("%d,%d",&x,&y);
	for(i=0;i<x;i++)/*定义周边值为0(同墙)*/
	{
		m[0][i]=0;/*行周边*/
		m[x-1][i]=0;
	}
	for(j=1;j<y-1;j++)
	{
		m[j][0]=0;
		/*列周边*/
		m[j][y-1]=0;
	}
	for(i=1;i<x-1;i++)
	{
		for(j=1;j<y-1;j++)
			m[i][j]=-1;/*定义通道初值为-1*/
	}
	printf("请输入迷宫内墙单元数:");
	scanf("%d",&j);
	if(j)
		printf("请依次输入迷宫内墙每个单元的行数,列数:\n");
	for(i=1;i<=j;i++)
	{
		scanf("%d,%d",&x1,&y1);
		m[x1][y1]=0;
	}
	printf("迷宫结构如下:\n");
	Print(x,y);
	printf("请输入起点的行数,列数:");
	scanf("%d,%d",&begin.x,&begin.y);
	printf("请输入终点的行数,列数:");
	scanf("%d,%d",&end.x,&end.y);
	m[begin.x][begin.y]=1;
	Try(begin,1);/*由第一步起点试探起*/
	return 0;
}

6*6行的迷宫






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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值