HDU 3137 No Left Turns(bfs)

来源:互联网 发布:mac禁用sleepimage 编辑:程序博客网 时间:2024/06/03 19:38

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 22struct 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;}
0 0
原创粉丝点击