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--;
}
}