题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3137
题意:除起点可以从四个方向走之外,其余点只能往前往右走,求最小距离
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int maxn = 25;
char map[maxn][maxn],vis[4][maxn][maxn];
int si,sj,step,n,m;
struct node
{
int i,j,dir;
node(int i,int j,int dir){
this->i=i;
this->j=j;
this->dir=dir;
};
};
queue<node> q;
void bfs(int i,int j,int ei,int ej)
{
int dir;
for(int k=0;k<4;k++)
{
q.push(node(i,j,k));
vis[k][i][j]=1;
}
while(!q.empty())
{
int sz=q.size();
while(sz--)
{
node a=q.front();q.pop();
int de=a.dir;
int dx=a.i,dy=a.j;
if(dx==ei&&dy==ej)
{
return;
}
//forward
if(de==0)//向上
dx--;
else if(de==1)//向下
dx++;
else if(de==2)//向左
dy--;
else if(de==3) //向右
dy++;
if(!vis[de][dx][dy]&&map[dx][dy]!='X')
{
q.push(node(dx,dy,de));
vis[de][dx][dy]=1;
}
//right
dx=a.i,dy=a.j;
if(de==0)
{
dy++;
de=3;
}
else if(de==1)
{
dy--;
de=2;
}
else if(de==2)
{
dx--;
de=0;
}
else if(de==3)
{
dx++;
de=1;
}
if(!vis[de][dx][dy]&&map[dx][dy]!='X')
{
q.push(node(dx,dy,de));
vis[de][dx][dy]=1;
}
}
step++;
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int ei,ej;
step=0;
while(!q.empty())q.pop();
memset(vis,0,sizeof(vis));
scanf("%d%d",&n,&m);
getchar();
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
scanf("%c",&map[i][j]);
if(map[i][j]=='S')si=i,sj=j;
if(map[i][j]=='F')ei=i,ej=j;
}
getchar();
}
bfs(si,sj,ei,ej);
printf("%d\n",step);
}
}
本文介绍了一道经典的最短路径问题,使用广度优先搜索(BFS)解决。题目要求从任意起点出发,在可以改变方向的前提下找到到达终点的最短步数。通过使用队列和三维访问数组实现算法。
1683

被折叠的 条评论
为什么被折叠?



