问题
它表示一个迷宫,其中的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)
最短路径显然时DFS,关键在于输出路径,我们先记录最优解,在逆序用递归输出就ok,由于POJ数据太少(貌似只有一组数据)用DFS也过:
#include<stdio.h>
int map[5][5];
int a[]={0,0,1,-1},b[]={1,-1,0,0};//平移向量
bool s(int x,int y)
{
if(x==0&&y==0){
return true;
}
for(int i=0;i<4;i++)
if(0<=x+a[i]&&x+a[i]<5&&0<=y+b[i]&&y+b[i]<5&&!map[x+a[i]][y+b[i]])
{
map[x+a[i]][y+b[i]]=1;//记录已经来过的地方 防止重复
if(s(x+a[i],y+b[i]))
{
printf("(%d, %d)\n",x+a[i],y+b[i]);
return true;
}
}
return false;
}
int main()
{
for(int j=0;j<5;j++)
for(int k=0;k<5;k++)
scanf("%d",&map[j][k]);
s(4,4);printf("(4, 4)\n");
return 0;
}
应该用BFS的:
#include<stdio.h>
#include<queue>
using namespace std;
typedef pair<int,int> P;
int dp[5][5],map[5][5];int INF=10000,W=5,H=5;
int a[4]={0,0,1,-1},b[4]={1,-1,0,0};
void print(int x,int y)
{
if(x==0&&y==0)
return ;
for(int i=0;i<4;i++)
if((0<=x+a[i]&&x+a[i]<5&&0<=y+b[i]&&y+b[i]<5)&&(dp[x][y]-dp[x+a[i]][y+b[i]]==1))
{
print(x+a[i],y+b[i]);
printf("(%d, %d)\n",x+a[i],y+b[i]);
return ;
}
}
int main()
{
for(int j=0;j<5;j++)
for(int k=0;k<5;k++)
scanf("%d",&map[j][k]),dp[j][k]=-1;
queue<P> q;P p;p.first=0,p.second=0;dp[0][0]=0;
q.push(p);
while(!q.empty())
{
for(int i=0;i<4;i++)
if(0<=q.front().first+a[i]&&q.front().first+a[i]<H&&0<=q.front().second+b[i]&&q.front().second+b[i]<W&&!map[q.front().first+a[i]][q.front().second+b[i]]&&dp[q.front().first+a[i]][q.front().second+b[i]]<0)
{
dp[q.front().first+a[i]][q.front().second+b[i]]=dp[q.front().first][q.front().second]+1;
p.first=q.front().first+a[i],p.second=q.front().second+b[i];
q.push(p);
}
q.pop();
}
print(4,4);//逆着输出
printf("(4, 4)\n");
return 0;
}
比如输入
0 1 0 0 0
0 1 0 1 0
0 0 0 1 0
0 1 0 0 0
0 0 0 1 0
我想说的是找最短距离问题用BFS,可行性问题用DFS