C语言实现迷宫问题一种解

迷宫问题一组解:

        //迷宫问题解答:

                首先需要定义的变量:迷宫M  ,  迷宫的行R=7  ,  迷宫的列C=8  ,  还需要定义一个与迷宫M相同的二维数组t(用来表示迷宫这个格子已经走过了,走过赋值为1)  ,  以及记录方位的二维数组Move[4][2](f方位表示已经在代码中给出注释);

        //迷宫问题需要注意的点:

                1.首先需要注意的是:记录走过格子的数组t,最主要的作用是防止迷宫绕圈走;

                比如:


                2.迷宫的回溯问题:

                        只要这条路可以走,并且与数组t相同位置所对应的数值为0,那么这个位置就可以走,如果以上两个条件不成立,那么这个位置就不能走,需要进行下一个方位的判断,如果四个方位都不能走,就需要回溯,回溯到上一个位置,但是回溯本身还在for循环中,所以,会接着for循环进行下一个方位的判断,看下一个方位是否可以走,不能走继续下一个方位,四个方位判断完之后还是不能走,接着回溯 . . . . . .   知道找到一个下一个位置;

                3.迷宫的输出问题:

                        1) 首先需要找到满足出口的条件才能,准备输出;

                        2) 如果找到出口return返回整型数字 1,fa之后将返回的值赋给tag;

                        3) 之后进入if判断,如果tag==1,输出离终点最近的格子位置;

                        4) 之后继续返回整型数字 1,一直到入口的位置,tag==1不成立,退出当前循环返回 0,if判断条件不成立,退出Maze函数,回到主调,输出出口位置坐标,结束整个程序;

//找到一组解后从出口向入口输出;
#include<stdio.h>
#define R 7  //行;
#define C 8  //列;
int M[R+2][C+2]=   //迷宫'1'表示墙,'0'表示路;
{      //0 1 2 3 4 5 6 7 8 9
    /*0*/1,1,1,1,1,1,1,1,1,1,
    /*1*/1,0,0,1,1,1,1,1,1,1,
    /*2*/1,0,0,0,1,1,1,1,1,1,
    /*3*/1,0,0,0,0,0,1,1,1,1,
    /*4*/1,0,1,0,0,1,0,1,1,1,
    /*5*/1,0,0,1,0,1,0,0,0,1,
    /*6*/1,1,1,1,0,0,0,1,0,1,
    /*7*/1,1,1,1,1,1,0,0,0,1,
    /*8*/1,1,1,1,1,1,1,1,1,1
};
int t[R+2][C+2]={0};  //与迷宫相同的二维数组,用来表示该条路有没有走;
int Move[4][2]=  //记录走的方向;
{      
	{1,0},    //向南走;
	{0,1},    //向东走;
	{-1,0},   //向北走;
	{0,-1}    //向西走;
};

//调用迷宫函数;
//先找到出口,在从出口向入口进行输出;
int Maze(int x,int y)
{
	if(x==7&&y==8)  //迷宫出口为(7,8);
		return 1;
	for(int i=0;i<4;i++)  //判断四个方位是否可以走;
	{
		int a=x+Move[i][0];  //表示下一步要走的横坐标;
		int b=y+Move[i][1];  //表示下一步要走的纵坐标;
		//M[a][b]是路并且可以走,用数组t判断是否可以走;
		if(!M[a][b]&&!t[a][b])  //只要走过t数组就标为1;
		{
			t[a][b]=1;   //表示该条路已经走过了;
			//最开始用于接受坐标(7,8),表示已经找到出口;
			int tag=Maze(a,b);  
			if(tag==1)
			{
				printf("<--(%d,%d)",a,b);  //输出该条路;
				//返回表示找到出口逐个返回,并且输出每个位置的坐标;
				return tag;  
			}
		}
	}
	return 0;
}

int main(void)
{
	printf("迷宫的一条出路为(从出口到入口):\n");
	printf("(出口)");
	int tag=Maze(1,1);  //迷宫入口为(1,1);
	printf("<--(%d,%d)(入口)\n",tag,tag);
	return 0;
}

//答案截图:



评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值