• 2018年北京信息科技大学第十届程序设计竞赛暨ACM选拔赛 A PUBG(bfs求最短路径)...


    链接:https://www.nowcoder.com/acm/contest/118/A
    来源:牛客网

    PUBG
    时间限制:C/C++ 1秒,其他语言2秒
    空间限制:C/C++ 32768K,其他语言65536K
    64bit IO Format: %lld

    题目描述

    最近,喜爱ACM的PBY同学沉迷吃鸡,无法自拔,于是又来到了熟悉的ERANGEL。经过一番搜寻,PBY同学准备动身前往安全区,但是,地图中埋伏了许多LYB,PBY的枪法很差,希望你能够帮他找到一条路线,每次只能向上、下、左、右移动,尽可能遇到较少的敌人。

    输入描述:

    题目包含多组测试,请处理到文件结束;
    第一行是一个整数n,代表地图的大小;
    接下来的n行中,每行包含n个整数a,每个数字a代表当前位置敌人的数量;
    1 < n <= 100,1 <= a <= 100,-1代表当前位置,-2代表安全区。

    输出描述:

    对于每组测试数据,请输出从当前位置到安全区所遇到最少的敌人数量,每个输出占一行。
    示例1

    输入

    5
    6 6 0 -2 3
    4 2 1 2 1
    2 2 8 9 7
    8 1 2 1 -1
    9 7 2 1 2

    输出

    9
    示例2

    输入

    5
    62 33 18 -2 85
    85 73 69 59 83
    44 38 84 96 55
    -1 11 90 34 50
    19 73 45 53 95

    输出

    173

    我的方法就是bfs,类似spfa
    #include<iostream>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include <queue>
    #include<stack>
    #include<cstdio>
    #include<vector>
    #include<deque>
    #include<algorithm>
    #include<iomanip>
    #define inf 0x3f3f3f3f
    #define ll long long
    using namespace std;
    int a[105][105];
    int v[105][105];
    int s[105][105];
    int d[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
    struct node
    {
        int x,y;
    };
    queue<node>q;
    int main()
    {
        int n;
        int si,sj;
        int ei,ej;
        while(cin>>n)
        {
            int min=inf;
            memset(s,inf,sizeof(s));
            memset(v,0,sizeof(v));
            for(int i=1;i<=n;i++)
            {
                for(int j=1;j<=n;j++)
                {
                    cin>>a[i][j];
                    if(a[i][j]==-1)
                    {
                        si=i;
                        sj=j;
                        a[i][j]=0;
                    }
                    if(a[i][j]==-2)
                    {
                        ei=i;
                        ej=j;
                        a[i][j]=0;
                    }
                }
            }
            node c;
            c.x=si;
            c.y=sj;
            v[si][sj]=1;
            s[si][sj]=0;
            q.push(c);
            //有点类似spfa
            while(!q.empty())
            {
                node c=q.front();
                q.pop();
                v[c.x][c.y]=0;//标记在不在队列里,因为可能等会会更新会更优
                for(int i=0;i<4;i++)
                {
                    int xx=c.x+d[i][0];
                    int yy=c.y+d[i][1];
                    if(xx<1||yy<1||xx>n||yy>n) continue;
                    if(s[c.x][c.y]+a[xx][yy]<s[xx][yy])
                    {
                        s[xx][yy]=s[c.x][c.y]+a[xx][yy];
                        if(!v[xx][yy])
                        {
                            v[xx][yy]=1;
                            node h;
                            h.x=xx;
                            h.y=yy;
                            q.push(h);//更新了,不在队列里就放队列里
                        }
                    }
    
                }
            }
            cout<<s[ei][ej]<<endl;
        }
        return 0;
    }
    
    
    


  • 相关阅读:
    Longest Common Prefix
    Roman to Integer
    Intger to Roman
    Container With Most Water
    Regular Expression Matching
    atoi
    Rotate List
    54. Search a 2D Matrix && Climbing Stairs (Easy)
    53. Minimum Window Substring
    52. Sort Colors && Combinations
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/13271035.html
Copyright © 2020-2023  润新知