迷宫问题

//功能:利用递归调用完成迷宫问题的求解
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
//申明迷宫函数
int maze(char **a,int m,int n);

//定义全局变量i,j用来存放迷宫数组的行数和列数
int i,j;

int main()
{
	int k;
	int m,n;
	char **a;//定义指向迷宫数组的二维指针
	printf("\n************************************迷宫问题************************************");
	printf("\t\t1、输入自己的迷宫\n\t\t2、系统随机产生一个迷宫\n");
	scanf("%d",&k);
	printf("输入迷宫的行数和列数:");
	scanf("%d%d",&i,&j);
	getchar();
	//动态分配迷宫数组的存储区域
	a=(char **)malloc(sizeof(char *)*i);
	for(m=0;m<i;m++)
	{
		a[m]=(char *)malloc(sizeof(char)*j);
	}
	//输入自己的迷宫数组元素
	if(k==1)
	{
		printf("输入一个迷宫数组,用1表示墙壁,用0表示空白区域\n");
		for(m=0;m<i;m++)
		{
			for(n=0;n<j;n++)
			{
				a[m][n]=getchar();
			}
			getchar();
		}
		printf("你输入的迷宫为:\n");
		for(m=0;m<i;m++)
		{
			for(n=0;n<j;n++)
			{
				printf(" %c ",a[m][n]);
			}
			printf("\n");
		}
	}
	//系统初始化一个迷宫数组
	else
	{
		//初始化一个迷宫数组并随机产生墙壁与空白,用1表示墙壁,用0表示空白区域
		srand((int)time(0));
		for(m=0;m<i;m++)
		{
			for(n=0;n<j;n++)
			{
				a[m][n]=rand()%2+'0';
				printf(" %c ",a[m][n]);
			}
			printf("\n");
		}
	}
	if(maze(a,0,0))
	{
		printf("找到了路径!\n");
		for(m=0;m<i;m++)
		{
			for(n=0;n<j;n++)
			{
				printf(" %c ",a[m][n]);
			}
			printf("\n");
		}
	}
	else
	{
		printf("该迷宫为死迷宫!\n");
	}
	getch();
	return 0;
}

int maze(char **a,int m,int n)
{
	int k;
	//该条件用于首次判断
	if(a[m][n]=='1')
		return 0;
	a[m][n]='2';
	if(m==i-1 && n==j-1 && a[m][n]=='2')
		return 1;	
	//向下走
	if(m+1<i && a[m+1][n]=='0')
	{
		k=maze(a,m+1,n);
		if(k==1)
			return 1;
	}
	//向上走
	if(m-1>-1 && a[m-1][n]=='0')
	{
		k=maze(a,m-1,n);
		if(k==1)
			return 1;
	}	
	//向右走
	if(n+1<j && a[m][n+1]=='0')
	{
		k=maze(a,m,n+1);
		if(k==1)
			return 1;
	}
	//向左走
	if(n-1>-1 && a[m][n-1]=='0')
	{
		k=maze(a,m,n-1);
		if(k==1)
			return 1;
	}
	a[m][n]='0';
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值