zoukankan      html  css  js  c++  java
  • 自动驾驶系统 bfs

    一家科技公司有一块试验地用于测试自动驾驶系统。试验地由n×m个格子组成,从上到下依次编号为第1n行,从左到右依次编号为第1m列。试验车位于其中的某个格子上,每次自动驾驶系统可以控制汽车往上下左右移动一格。汽车不能走出边界,也不能碰到障碍格。


    你需要编写自动驾驶系统中的导航部分。在测试的一开始,试验地里没有任何障碍。你的程序会依次收到q条信息,它们的格式是以下两种之一:

    ? x y,表示询问从第1行第1列的格子出发,到达第x行第y列的格子最少需要移动多少次。
    * x y,表示第x行第y列的格子变成了障碍格。

    Input

    第一行包含一个正整数T(1T5),表示测试数据的组数。

    每组数据第一行包含三个正整数n,m,q(1n,m50,1q100000),表示试验地的尺寸以及信息的数量。

    接下来m行,每行描述一条信息。其中1x,yn,保证每个格子不会被重复变成障碍格多次,且(1,1)不会变成障碍格。

    Output

    对于每个询问输出一行一个整数,即最少移动次数,若无法到达请输出1

    Sample Input

    1
    3 4 5
    ? 2 2
    * 1 2
    ? 2 2
    * 2 1
    ? 2 2

    Sample Output

    2
    2
    -1

    Author

    Claris

    Source

    "字节跳动杯"杭州电子科技大学第十九届程序设计竞赛
     
     
    这是一个图比较小 但是询问次数非常多的普通bfs  比赛的时候没有想出来很可惜  
    #include<bits/stdc++.h>
    using namespace std;
    //input
    #define rep(i,a,b) for(int i=(a);i<=(b);i++)
    #define repp(i,a,b) for(int i=(a);i>=(b);i--)
    #define RI(n) scanf("%d",&(n))
    #define RII(n,m) scanf("%d%d",&n,&m);
    #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k)
    #define RS(s) scanf("%s",s);
    #define ll long long
    #define inf 0x3f3f3f3f
    #define REP(i,N)  for(int i=0;i<(N);i++)
    #define CLR(A,v)  memset(A,v,sizeof A)
    //////////////////////////////////
    #define N 500+5
    int dx[4]={0,1,0,-1};
    int dy[4]={1,0,-1,0};
    int n,m,ex,ey;
    int d[N][N];
    int mp[N][N];
    struct node
    {
        int x,y;
    };
    void bfs()
    {
        CLR(d,-1);
        d[1][1]=0;
        node u,v;
        u.x=1;
        u.y=1;
        queue<node>q;
        q.push(u);
        while(!q.empty())
        {
            u=q.front();q.pop();
            rep(i,0,3)
            {
                node v=u;
                v.x+=dx[i];
                v.y+=dy[i];
                if(d[v.x][v.y]!=-1)continue;
                if(mp[v.x][v.y]==1)continue;
                if(  !(v.x>=1&&v.x<=n&&v.y>=1&&v.y<=m)  )continue;
                d[v.x][v.y]=d[u.x][u.y]+1;
                q.push(v);
            }
        }
    }
    int main()
    {
       int cas;
       RI(cas);
       while(cas--)
       {
           CLR(mp,0);
           int q;
           RIII(n,m,q);
           bfs();
           while(q--)
           {
               char s[4];
               RS(s);
    
               RII(ex,ey);
               if(s[0]=='*')
               {
                   mp[ex][ey]=1;
                   bfs();
               }
               else printf("%d
    ",d[ex][ey]);
           }
       }
        return 0;
    }
    View Code
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    HDU 6143 Killer Names【dp递推】【好题】【思维题】【阅读题】
    HDU 6143 Killer Names【dp递推】【好题】【思维题】【阅读题】
    POJ 3974 Palindrome【manacher】【模板题】【模板】
    POJ 3974 Palindrome【manacher】【模板题】【模板】
    HDU 6127 Hard challenge【计算机几何】【思维题】
    HDU 6127 Hard challenge【计算机几何】【思维题】
    HDU 6129 Just do it【杨辉三角】【思维题】【好题】
    HDU 6129 Just do it【杨辉三角】【思维题】【好题】
    HDU 3037 Saving Beans【Lucas定理】【模板题】【模板】【组合数取余】
    8.Math 对象
  • 原文地址:https://www.cnblogs.com/bxd123/p/10658018.html
Copyright © 2011-2022 走看看