Description
给出一个n*m矩阵,’X’不能走,’ ‘可以走,’S’是起点,’F’是终点,问不左转的情况下从起点到终点所用最少步数是多少(保证路径存在)
Input
第一行为一整数T表示用例组数,每组用例第一行为两个整数n和m表示矩阵行列数(3< n,m<=20),之后为一n*m矩阵
Output
对于每组用例,输出不左转情况下从起点到终点所用最少步数
Sample Input
Sample Output
29
Solution
bfs,对于经过的每个点要记录其方向,用1,2,3,4分别表示向右,向下,向左和向上,然后每次将出队元素向右和向前走一步到达的点进队即可
Code
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
#define maxn 22
struct node
{
int x,y,to,step;
};
int t,n,m,sx,sy,ex,ey,vis[5][maxn][maxn];
char M[maxn][maxn];
int bfs()
{
memset(vis,0,sizeof(vis));
queue<node>que;
node now,temp;
temp.x=sx,temp.y=sy,temp.step=0;
for(int i=1;i<=4;i++)
{
temp.to=i;
que.push(temp);
vis[i][sx][sy]=1;
}
while(!que.empty())
{
now=que.front();que.pop();
int x1,y1,x2,y2,to;
x1=x2=now.x,y1=y2=now.y;
if(now.to==1)x1--,y2++,to=2;
if(now.to==2)y1++,x2++,to=3;
if(now.to==3)x1++,y2--,to=4;
if(now.to==4)y1--,x2--,to=1;
if(x1>=1&&x1<=n&&y1>=1&&y1<=m&&M[x1][y1]!='X'&&!vis[now.to][x1][y1])
{
if(x1==ex&&y1==ey)return now.step+1;
vis[now.to][x1][y1]=1;
temp.x=x1,temp.y=y1,temp.to=now.to,temp.step=now.step+1;
que.push(temp);
}
if(x2>=1&&x2<=n&&y2>=1&&y2<=m&&M[x2][y2]!='X'&&!vis[to][x2][y2])
{
if(x2==ex&&y2==ey)return now.step+1;
vis[to][x2][y2]=1;
temp.x=x2,temp.y=y2,temp.to=to,temp.step=now.step+1;
que.push(temp);
}
}
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
getchar();
for(int i=1;i<=n;i++)
{
gets(M[i]+1);
for(int j=1;j<=m;j++)
if(M[i][j]=='S')sx=i,sy=j;
else if(M[i][j]=='F')ex=i,ey=j;
}
int ans=bfs();
printf("%d\n",ans);
}
return 0;
}