HDU 3137 No Left Turns(bfs)

125 篇文章 0 订阅

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值