Litmxs找女友

1410: Litmxs找女友

题目描述
Litmxs 是个肥宅,很少出门.可是在11.11那天,他做梦梦到女朋友被困在了地铁站,他必须去接她.他想选择一条最快的路,接到他的女朋友.
问题是这样的.每次下大雨的时候,ZSTU就变成了浙江游泳大学,从寝室到校区,水茫茫一片.只有部分道路可以走人.我们假定ZSTU是一个N*M的地图.Litmxs在寝室(1,1),而地铁站的位置在(n,m),有些地方因为被水淹没了,不能过人.每次只能上下左右走一步,每一步耗时1S.请你告诉他接到女朋友的所花费的时间最少是多少。如果不能找到输出-1.

输入
先输入一个T,代表有T组测试数据。每组测试数据输入两个整数n,m.接下来是nm(n行m列)的地图 ‘.’代表可走,’’代表被水淹没(T<=100,2<=n<=5e2,2<=m<=5e2,保证max(n, m)>50的数据小于5组)

输出
每组输出一个数字占一行;

样例输入
1
4 4
…**
.*

…*.

样例输出
6

提示
样例解释:(1,1) →(1,2) →(2,2) →(3,2) →(3,3) →(3,4) →(4,4)

提示:由于数据较大,请用scanf读入
一、解题思路
因为是求最短时间,所以应该用广搜,当到达目的地时输出答案即可。

二、源代码 (我用数组模拟队列)

#include <bits/stdc++.h>
using namespace std;
const int MAXN=5e2+10;
int t,n,m;
char a[MAXN][MAXN];
bool pd[MAXN][MAXN];
int zb[4][2]= {1,0,0,1,-1,0,0,-1};
struct s
{
    int x,y;
    int time;
} que[250010];
void BFS()
{
    int head=1;
    int tail=1;
    que[tail].x=0;
    que[tail].y=0;
    que[tail].time=0;
    tail++;
    memset(pd,0,sizeof(pd));
    pd[0][0]=1;
    while(head<tail)
    {
        if(que[head].x==n-1&&que[head].y==m-1)
        {
            printf("%d\n",que[head].time);
            return;
        }
        for(int i=0; i<4; i++)
        {
            int tx=que[head].x+zb[i][0];
            int ty=que[head].y+zb[i][1];
            if(0<=tx&&tx<n&&0<=ty&&ty<m&&!pd[tx][ty]&&a[tx][ty]!='*')
            {
                que[tail].x=tx;
                que[tail].y=ty;
                que[tail].time=que[head].time+1;
                pd[que[tail].x][que[tail].y]=1;
                tail++;
            }
        }
        head++;
    }
    printf("-1\n");
    return;
}
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        for(int i=0; i<n; i++)scanf("%s",a[i]);
        BFS();
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值