老鼠走迷宫解析

题目:

{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,//输入迷宫地图(之所以+2是为了减少
                    1,0,1,0,0,0,1,1,0,0,0,1,1,1,1,1,1,//在边界时的讨论)
                    1,1,0,0,0,1,1,0,1,1,1,0,0,1,1,1,1,
                    1,0,1,1,0,0,0,0,1,1,1,1,0,0,1,1,1,
                    1,1,1,0,1,1,1,1,0,1,1,0,1,1,0,0,1,
                    1,1,1,0,1,1,1,1,0,1,1,0,1,1,0,0,1,
                    1,1,1,0,1,0,0,1,0,1,1,1,1,1,1,1,1,
                    1,0,0,1,1,0,1,1,1,0,1,0,0,1,1,1,1,
                    1,0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,
                    1,0,0,1,1,0,1,1,0,1,1,1,1,1,0,1,1,
                    1,1,1,0,0,0,1,1,0,1,1,0,0,0,1,0,1,
                    1,0,0,1,1,1,1,1,0,0,0,1,1,1,1,0,1,
                    1,0,1,0,0,1,1,1,1,1,0,1,1,1,1,0,1,
                    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};

有如上的一个二维数组,用来表示一个地图,其中0表示可以通过,1表示墙,一个老鼠从右下角的起点出发,如何才能到左上角,输出路径

算法思想:回溯

具体解析:首先从起点开始,依次往各个方向进行查看,如果可以通过那么向前进,然后在这个点继续依次往各个方向查看(这里就是回溯)。直到最后找到终点为止。

代码:

#include<stdio.h>
#define M 12
#define N 15
int maze[M+2][N+2]={1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,//输入迷宫地图(之所以+2是为了减少
                    1,0,1,0,0,0,1,1,0,0,0,1,1,1,1,1,1,//在边界时的讨论)
                    1,1,0,0,0,1,1,0,1,1,1,0,0,1,1,1,1,
                    1,0,1,1,0,0,0,0,1,1,1,1,0,0,1,1,1,
                    1,1,1,0,1,1,1,1,0,1,1,0,1,1,0,0,1,
                    1,1,1,0,1,1,1,1,0,1,1,0,1,1,0,0,1,
                    1,1,1,0,1,0,0,1,0,1,1,1,1,1,1,1,1,
                    1,0,0,1,1,0,1,1,1,0,1,0,0,1,1,1,1,
                    1,0,1,1,1,1,0,0,1,1,1,1,1,1,1,1,1,
                    1,0,0,1,1,0,1,1,0,1,1,1,1,1,0,1,1,
                    1,1,1,0,0,0,1,1,0,1,1,0,0,0,1,0,1,
                    1,0,0,1,1,1,1,1,0,0,0,1,1,1,1,0,1,
                    1,0,1,0,0,1,1,1,1,1,0,1,1,1,1,0,1,
                    1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1};
int mark[M+2][N+2];
int move[8][2]={{0,-1},{0,1},{-1,0},{1,0},{-1,-1},{1,1},{1,-1},{-1,1}};

int seepath(int x,int y)
{
	int i,g,h;
	if(x==1&&y==1)
		return 1;
	else
		for(i=0;i<8;i++)
		{
			g=x+move[i][0];
			h=y+move[i][1];
			if(maze[g][h]==0&&mark[g][h]==0)
			{
				mark[g][h]=1;
				if(seepath(g,h))
				{
					printf("(%d,%d)",g,h);
					if(move[i][0]==-1&&move[i][1]==-1)printf("westnorth->");
					if(move[i][0]==-1&&move[i][1]==0)printf("west->");
					if(move[i][0]==-1&&move[i][1]==1)printf("westsouth->");
					if(move[i][0]==0&&move[i][1]==-1)printf("north->");
					if(move[i][0]==0&&move[i][1]==1)printf("south->");
					if(move[i][0]==1&&move[i][1]==-1)printf("easthnorth->");
					if(move[i][0]==1&&move[i][1]==0)printf("easth->");
					if(move[i][0]==1&&move[i][1]==1)printf("easthsouth->");
					printf("\n");
					maze[g][h]=8;
					return 1;
				}
			}
		}
		if(x==M&&y==N)
			printf("no path\n");
			return 0;
}

int main()
{
	int i,j;
	for(i=0;i<M+2;i++)
		for(j=0;j<N+2;j++)
			mark[i][j]=0;
	mark[M][N]=1;
	if(seepath(M,N))
	{
		printf("(%d,%d)",M,N);
		printf("\n");
       maze[M][N]=8;//将起点设为通路
       for (i=1;i<M+1;i++)
           for (j=1;j<N+1;j++)
           {
              printf("%2d",maze[i][j]);
              if(j==N) 
			  	printf("\n");
           }//打印出走通后的迷宫
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值