zoukankan      html  css  js  c++  java
  • HDU 1240 Asteroids!

    https://vjudge.net/problem/HDU-1240

    题意:在一个三维空间中找条路线,是否能到达终点。

    多组数据输入

    第一行 Start N (一个N*N*N的三维空间)

    输入这个三维空间。

    'X'表示不可走

    'O'表示可走

    输入起点和终点

    注意起点和终点是(y,z,x)

    啊啊啊 英语太烂了 没注意输入的起点和终点,误认为输入的起点和终点是 (x,y,z) wa了两发

    题解:BFS 解这个 N*N*N 的空间,寻找解决方案。

    #include <iostream>
    #include <stdio.h>
    #include <queue>
    #include <vector>
    #include <cstring>
    using namespace std;
    const int N = 12;
    char mp[N][N][N];
    char st[10],ed[10];
    int n;
    int dir[6][3] = {0,0,1,0,1,0,1,0,0,0,0,-1,0,-1,0,-1,0,0};  //方向
    int sx,sy,sz,ex,ey,ez;  //起点(x,y,z) 终点(x,y,z)
    struct node  //定义结构体
    {
        int x,y,z,step;
    };
    bool inbound(int x, int l, int r)  //判断方向是否合法
    {
        if(x < l || x >= r) return false;
        return true;
    }
    
    void bfs()
    {
        bool flag = true;  //标记是否有路线
        node now,Next;
        now.step = 0, now.x = sx, now.y = sy, now.z = sz;
        queue<node> q;
        q.push(now);  //入队
        while(!q.empty())  
        {
            now = q.front();  //获取当前队首
            q.pop();  //出队
            if(now.x == ex && now.y == ey && now.z == ez)  //看是否到达终点
            {
                flag = false;
                printf("%d %d
    ",n,now.step);
                break;
            }
            for(int i = 0; i < 6; i++)  //方向扩展
            {
                Next.x = now.x + dir[i][0];
                Next.y = now.y + dir[i][1];
                Next.z = now.z + dir[i][2];
    
                if(!inbound(Next.x,0,n) || !inbound(Next.y,0,n) || !inbound(Next.z,0,n)) continue;  //是否合法
                if(mp[Next.x][Next.y][Next.z] == 'O')  //是否可走
                {
                    Next.step = now.step + 1;
                    mp[Next.x][Next.y][Next.z] = 'X';
                    q.push(Next);
                }
            }
        }
        if(flag) puts("NO ROUTE");
    }
    int main()
    {
        while(~scanf(" %s %d",st,&n))
        {
            for(int i = 0; i < n; i++)
                for(int j = 0; j < n; j++)
                    for(int k = 0; k < n; k++)
                        scanf(" %c",&mp[i][j][k]);
            scanf(" %d %d %d %d %d %d %s",&sy,&sz,&sx,&ey,&ez,&ex,ed);
            bfs();
        }
        return 0;
    }
    

      

  • 相关阅读:
    linux常用命令
    linux简介
    vmware+CentOs 6.9的安装步骤
    Android layer type与WebView白屏-第一次加载webview很慢
    Android View框架的measure机制
    maven的facet错误解决方法
    oracle jdbc驱动发布nexus
    dubbox2.8.4编译发布到私服(nexus)
    一致性哈希 与 普通哈希对比
    1对多业务,数据库水平切分架构一次搞定 | 架构师之路
  • 原文地址:https://www.cnblogs.com/Edviv/p/12250033.html
Copyright © 2011-2022 走看看