迷宫问题POJ - 3984

http://poj.org/problem?id=3984

定义一个二维数组:

int maze[5][5] = {

	0, 1, 0, 0, 0,

	0, 1, 0, 1, 0,

	0, 0, 0, 0, 0,

	0, 1, 1, 1, 0,

	0, 0, 0, 1, 0,

};


它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。

Input

一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。

Output

左上角到右下角的最短路径,格式如样例所示。

Sample Input

0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0

Sample Output

(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)

递归暴力遍历

#include<stdio.h>
#include<stdlib.h>
#define max 50
typedef struct
{
	int i;
	int j;
}box;
typedef struct
{
	box data[max];
	int top;
}sqstack;
sqstack *s,anwer;
int min;
int flag=1;
int mg[7][7]=
{
	{1,1,1,1,1,1,1},
	{1,0,0,0,0,0,1},
	{1,0,0,0,0,0,1},
	{1,0,0,0,0,0,1},
	{1,0,0,0,0,0,1},
	{1,0,0,0,0,0,1},
	{1,1,1,1,1,1,1},
};
void mgpath(int i,int j);
int main()
{
	int i,j;
	s=(sqstack *)malloc(sizeof(sqstack));
	s->top=-1;
	for(i=1;i<6;i++)
	   for(j=1;j<6;j++)
		   scanf("%d",&mg[i][j]);
	mgpath(1,1);
	for(i=0;i<=anwer.top;i++)
        printf("(%d, %d)\n",anwer.data[i].i-1,anwer.data[i].j-1);
	printf("(4, 4)");
	return 0;
}
void mgpath(int i,int j)
{
	int i1;
	int i2,j2,di;
	if(i==5&&j==5)
	{
		if(flag)
		{
			min=s->top;
			flag=0;
			for(i1=0;i1<=s->top;i1++)
				{
					anwer.data[i1].i=s->data[i1].i;
					anwer.data[i1].j=s->data[i1].j;
					anwer.top=s->top;
				}
		}
		if(s->top<min)
			{
				for(i1=0;i1<=s->top;i1++)
				{
					anwer.data[i1].i=s->data[i1].i;
					anwer.data[i1].j=s->data[i1].j;
					anwer.top=s->top;
				}
				min=s->top;
			}
	}
	else
	{
		s->top++;
		s->data[s->top].i=i;
		s->data[s->top].j=j;
		mg[i][j]=-1;
		for(di=0;di<4;di++)
		{
			switch(di)
			{
			case 0:i2=i-1;j2=j;  break;
			case 1:i2=i;  j2=j+1;break;
			case 2:i2=i+1;j2=j;  break;
			case 3:i2=i;  j2=j-1;
			}
			if(mg[i2][j2]==0)
				mgpath(i2,j2);
		}
		mg[s->data[s->top].i][s->data[s->top].j]=0;
		s->top--;
	}
}

猜你喜欢

转载自blog.csdn.net/shenyulingyeye/article/details/81460552