版权声明:本文为博主原创文章,未经博主允许不得转载。
定义一个二维数组N*M(其中2<=N<=10;2<=M<=10),如5
int
};
它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。入口点为[0,0],既第一空格是可以走的路。
Input
一个N
Output
左上角到右下角的最短路径,格式如样例所示。
Sample
0
0
0
0
0
Sample
(0,
(1,
(2,
(2,
(2,
(2,
(2,
(3,
(4,
输入描述:
输入两个整数,分别表示二位数组的行数,列数。再输入相应的数组,其中的1表示墙壁,0表示可以走的路。数据保证有唯一解,不考虑有多解的情况,即迷宫只有一条通道。
输出描述:
左上角到右下角的最短路径,格式如样例所示。
//c语言,用的回溯,栈。
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define Maxsize 100
struct
//i,j为当前位置,di为下一个前进的位置,上,右,下,左,分别对应0,1,2,3;
{
int
i;
int
j;
int
di;
}Stack[Maxsize],Path[Maxsize];
int
main()
{
int
M,N;
while
(
scanf
(
"%d %d"
,&M,&N)!=EOF)
{
int
i,j,k,di,find,mg[10][10];
int
top=-1,minlen=Maxsize;
memset
(mg,0,
sizeof
(mg));
for
(i=1;i<=M;i++)
//输入模块
for
(j=1;j<=N;j++)
scanf
(
"%d"
,&mg[i][j]);
for
(i=0;i<=N+1;i++)
//两个for循环把输入数组的四周全部变成1,防止越界
{
mg[0][i]=1;
mg[M+1][i]=1;
}
for
(j=1;j<=M;j++)
{
mg[j][0]=1;
mg[j][N+1]=1;
}
top++;
Stack[top].i=1;
Stack[top].j=1;
Stack[top].di=-1;
mg[1][1]=-1;
while
(top>-1)
//输出模块
{
i=Stack[top].i;j=Stack[top].j;di=Stack[top].di;
if
(i==M&&j==N)
{
if
(top+1
{
for
(k=0;k<=top;k++)
Path[k]=Stack[k];
minlen=top+1;
}
mg[Stack[top].i][Stack[top].j]=0;
top--;
i=Stack[top].i;j=Stack[top].j;di=Stack[top].di;
}
find=0;
while
(di<4&&find==0)
{
di++;
switch
(di)
{
case
0:i=Stack[top].i-1;j=Stack[top].j;
break
;
case
1:i=Stack[top].i;j=Stack[top].j+1;
break
;
case
2:i=Stack[top].i+1;j=Stack[top].j;
break
;
case
3:i=Stack[top].i;j=Stack[top].j-1;
break
;
}
if
(mg[i][j]==0)
find=1;
}
if
(find==1)
{
Stack[top].di=di;
top++;
Stack[top].i=i;
Stack[top].j=j;
Stack[top].di=-1;
mg[i][j]=-1;
//进栈,防止重复,把当前值改为-1;
}
else
//退栈的话,当前值置为0
{
mg[Stack[top].i][Stack[top].j]=0;
top--;
}
}
for
(k=0;k
printf
(
"(%d,%d)\n"
,(Path[k].i-1),(Path[k].j-1));
}
}