【题目描述】
定义一个二维数组:
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表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。
【输入】
一个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
【输出样例】
(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)
这题只需要定义两个数组,一个存当前路径,另一个存最短路径就行了。
下面是代码:
#include<bits/stdc++.h>
using namespace std;
int X[26],Y[26],a[5][5],XX[26],YY[26],Min=INT_MAX;
int xx[5]={0,0,0,1,-1};
int yy[5]={0,1,-1,0,0};
void print(int n)
{
for(int i=1;i<=n;i++)
{
printf("(%d, %d)\n",XX[i],YY[i]);
}
}
void fz(int n) {
for(int i=1;i<=n;i++)
{
XX[i]=X[i];
YY[i]=Y[i];
}
}
void dfs(int x,int y,int sum)
{
X[sum]=x;
Y[sum]=y;
if(x==4&&y==4)
{
Min=min(sum,Min);
if(Min==sum)
fz(sum);
return ;
}
for(int i=1;i<=4;i++)
{
if(x+xx[i]>=0&&y+yy[i]>=0&&x+xx[i]<5&&y+yy[i]<5&&!a[x+xx[i]][y+yy[i]])
{
a[x][y]=1;
dfs(x+xx[i],y+yy[i],sum+1);
a[x][y]=0;
}
}
}
int main() {
for(int i=0;i<5;i++)
{
for(int j=0;j<5;j++)
{
scanf("%d",&a[i][j]);
}
}
dfs(0,0,1);
print(Min);
return 0;
}