• 【BFS】hdu 1240 Asteroids!


    题目描述:

    http://acm.hdu.edu.cn/showproblem.php?pid=1240

     

    中文大意:

    人在太空,想要回家,遇小行星,需要绕行。

    行星场的大小为 N x N x N,飞行器可以在上、下、左、右、前、后 6 个方向上移动,但仅限标记为 “O” 的区域,标记为 “X” 的区域代表有行星。

    要求:计算回家的最少移动次数,若不能回家,打印 “NO ROUTE”。

     

    思路:

    (1)如果起点和终点在同一个位置,则返回 0 ,过程结束,否则执行接下来的操作;

    (2)设置起点 s 的移动次数为 0 ,并将其放到队列 q 中;

    (3)如果 q 是空队列,则说明整个 bfs 过程并没有找到终点,返回 -1,过程结束,否则继续;

    (4)取队列 q 中最前面的节点 node;

    (5)尝试访问 node 节点周围的节点(注意是 6 个方向),若没有后继节点,即周围都是行星,则转到(3);

    (6)将 node 节点的所有后继节点的移动次数设置为 node.dis + 1,并标记为不可再被访问;

    (7)如果后继节点中存在终点,则返回其移动次数,过程结束,否则将所有后继节点都放在队列 q 的末端;

    (8)转到(3)。

     

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    
    char star[10][10][10]; 
    int n;
    
    struct node{
        int x,y,h;
        int dis;
    };
    
    int dir[6][3] = {{0,0,1}, {0,0,-1}, {0,1,0}, {0,-1,0}, {1,0,0}, {-1,0,0}}; 
    
    node start,goal;
    
    bool check(node next){
        if(next.x >=0 && next.x < n && next.y >=0 && next.y < n && next.h >=0 && next.h < n){
            return true;
        }
        return false;
    }
    
    int bfs(){
        if(start.h == goal.h && start.y == goal.y && start.x == goal.x){
            return 0;
        }
        
        start.dis = 0;
        queue<node> q;
        q.push(start);
        
        while(!q.empty()){
            start = q.front();
            q.pop();
            
            for(int i=0;i<6;i++){
                node next;
                next.x = start.x + dir[i][0];
                next.y = start.y + dir[i][1];
                next.h = start.h + dir[i][2];
                
                if(check(next) && star[next.h][next.y][next.x] == 'O'){
                    star[next.h][next.y][next.x] = 'X';
                    next.dis = start.dis + 1;
                    
                    if(next.h == goal.h && next.y == goal.y && next.x == goal.x){
                        return next.dis;
                    }
                    
                    q.push(next); 
                }
            }
        }
        return -1;
    }
    
    int main(){
        string str;
        
        while(cin>>str){
            scanf("%d", &n);
            getchar();
            
            for(int i=0;i<n;i++){//slice
                for(int j=0;j<n;j++){//row
                    for(int k=0;k<n;k++){//column
                        scanf("%c", &star[i][j][k]);
                    }
                    getchar();
                }
            }
            
            scanf("%d %d %d", &start.x, &start.y, &start.h);
            scanf("%d %d %d", &goal.x, &goal.y, &goal.h);
            
            cin>>str;
            
            int num = bfs();
            
            if(num == -1){
                printf("NO ROUTE
    ");
            }
            else{
                printf("%d %d
    ", n, num);
            }
        }
    } 
    作者:老干妈就泡面
    本文版权归作者和博客园共有,欢迎转载,但请给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
  • 相关阅读:
    vs编译错误error C2059 由extern "C"导致的错误处理
    原生JS:响应式轮播图
    JSP用户关注取关实现
    JSP和AJAX实现登录注册
    MySQL常用命令
    offsetWidth/getBoundingRect()/scrollWidth/client用法总结
    画廊相册—原生JavaScript实现
    《JavaScript DOM 编程艺术》读书笔记
    天猫网页前端实现
    Docker安装和配置(链接集合)
  • 原文地址:https://www.cnblogs.com/bjxqmy/p/14340917.html
Copyright © 2020-2023  润新知