zoukankan      html  css  js  c++  java
  • [NWPU2016][寒假作业][正常版第三组]R&&HDU1240

    题意是有个三维的地图,从起点到终点的最短路径。用bfs做,不过这个题坑的地方在于,开三维数组你要搞清楚纬度的关系。a[i][j][h] i是层,j是行,h是列。然后坐标呢,又是列,行,层,所以如果要用sx,sy,sz,读取的时候要用 sz,sy,sx,的顺序读取。然后才能啊a[sx][sy][sz]这么用。。。这个搞了好久才搞清楚。。。好笨啊。不这么来也行,只要搞清楚行列层关系就好。

    #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <map>
    #include <string>
    #include <string.h>
    #include <queue>
    #include <vector>
    #include <set>
    #include <cmath>
    #define inf 0x7fffffff
    using namespace std;
    char s[100],w[20][20][20],flag[20][20][20],m[20][20][20],e[100];
    int n,sx,sy,sz,gx,gy,gz;
    int dir[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
    struct p{
    int x,y,z;
    };
    int bfs(){
       queue<p> q;
       p a;
       a.x=sx,a.y=sy,a.z=sz;
       flag[sx][sy][sz]=1;
       q.push(a);
       while(q.size())
       {
            p b;
            b=q.front();
            q.pop();
            if(b.x==gx&&b.y==gy&&b.z==gz) return 1;
            for(int i=0;i<6;i++)
            {
                    int nx=b.x+dir[i][0],ny=b.y+dir[i][1],nz=b.z+dir[i][2];
                    if(w[nx][ny][nz]=='O'&&!flag[nx][ny][nz]&&nx>0&&nx<=n&&ny>0&&ny<=n&&nz>0&&nz<=n)
                    {
                            flag[nx][ny][nz]=1;
                            p c;
                            c.x=nx,c.y=ny,c.z=nz;
                            q.push(c);
                            m[nx][ny][nz]=m[b.x][b.y][b.z]+1;
                    }
            }
       }
       return 0;
    }
    int main()
    {
        while(scanf("%s%d",s,&n)!=EOF)
        {
            memset(flag,0,sizeof(flag));
            memset(m,0,sizeof(m));
            for(int i=1;i<=n;i++)
            {
                    for(int j=1;j<=n;j++)
                    {
                            for(int h=1;h<=n;h++)
                            {
                                    scanf(" %c",&w[i][j][h]);
                            }
                    }
            }
            scanf("%d%d%d%d%d%d",&sz,&sy,&sx,&gy,&gz,&gx);
            sx+=1,sy+=1,sz+=1,gx+=1,gy+=1,gz+=1;
            scanf("%s",e);
             if(bfs())
              printf("%d %d
    ",n,m[gx][gy][gz]);
              else printf("NO ROUTE
    ");
            }
        return 0;
    }
  • 相关阅读:
    sqllite小型数据库的使用
    winform打开本地html页面
    【app】自动化必备之adb使用
    【app】自动化环境搭建(Appium)for java
    【app】Hybrid?Native?不知道你就out了!
    589. N叉树的前序遍历
    590. N叉树的后序遍历
    897. 递增顺序查找树
    559. N叉树的最大深度
    108. 将有序数组转换为二叉搜索树
  • 原文地址:https://www.cnblogs.com/GeniusYang/p/5190580.html
Copyright © 2011-2022 走看看