• 2018ICPC焦作 F. Honeycomb /// BFS


    题目大意:

    给定n m表示一共n行每行m个蜂巢

    求从S到T的最短路径

    input

    1
    3 4
      +---+       +---+
     /          /     
    +       +---+       +---+
                     /     
      +   +   S   +---+   T   +
     /          /           /
    +       +---+       +   +
                     /     
      +---+       +---+       +
     /                       /
    +       +---+       +   +
                      /     
      +---+       +---+       +
                /          /
            +---+       +---+

    output

    7

    如图所示,其实只要按平常的走迷宫改变一下位移的格数就行了

    改成一下的 上,下,左上,右上,左下,右下 的位移格数

    如下位移格数,移动后为墙所在的位置,判断有没有墙即可判断能不能通过

    int mov[6][2]={ {-2,0},{2,0},
                    {-1,-3},{-1,3},
                    {1,-3},{1,3}  };

    然后将每个蜂巢的中心点当做固定点,即要到达这个蜂巢就将坐标定位在这个蜂巢的中心点

    这样就会发现,两个中心点的距离其实就是两倍位移格数

    这个思路很好写 场上想复杂了 直接带偏队友思路 引以为戒a...

    #include <bits/stdc++.h>
    #define INF 0x3f3f3f3f
    using namespace std;
    const int N=1e4+5;
    char G[N][N];
    int n,m,stx,sty;
    int mov[6][2]={ {-2,0},{2,0},
                    {-1,-3},{-1,3},
                    {1,-3},{1,3}  };
    struct NODE { int x,y,l; }; 
    int bfs() {
        queue <NODE> q;
        q.push((NODE){stx,sty,1});
        while(!q.empty()) {
            NODE e=q.front(); q.pop();
            for(int i=0;i<6;i++) {
                int x1=e.x+mov[i][0];
                int y1=e.y+mov[i][1];
                int x2=x1+mov[i][0];
                int y2=y1+mov[i][1]; 
                if(G[x1][y1]==' ' && G[x2][y2]=='T') return e.l+1;
                if(G[x1][y1]!=' ' || G[x2][y2]!=' ') continue; 
                G[x2][y2]='#';
                q.push((NODE){x2,y2,e.l+1});
            }
        }
        return INF;
    }
    int main()
    {
        int t; scanf("%d",&t);
        while(t--){
            scanf("%d%d",&n,&m);
            getchar();
            n=n*4+3, m=m*6+3;
            for(int i=1;i<=n;i++) {
                char ch; G[i][0]=' '; int j=1;
                while(~scanf("%c",&ch)&&ch!='
    ') {
                    G[i][j]=ch;
                    if(ch=='S') stx=i,sty=j;
                    j++;
                } G[i][j]='';
            }
            int ans=bfs(); 
            if(ans==INF) printf("-1
    ");
            else printf("%d
    ",ans);
        }
    
        return 0;
    }
    View Code
  • 相关阅读:
    多态
    接口和抽象类
    反射
    C++ 模板和 C# 泛型的区别
    基础类库中的泛型
    运行时中的泛型
    泛型代码中的 default 关键字
    泛型委托
    泛型方法
    泛型接口
  • 原文地址:https://www.cnblogs.com/zquzjx/p/10104225.html
Copyright © 2020-2023  润新知