HDU 1240 Asteroids!



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

三维空间中的BFS求最短路

#include <queue>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>

using namespace std;


struct node{
    int y,x,z;
    void init(int ny, int nx, int nz){
        x = nx;
        y = ny;
        z = nz;
    }
};

char str[10],map[15][15][15];
int N,y1,x1,z1,y2,x2,z2;
int dis[15][15][15],vis[15][15][15];
int dir[6][3] = {{0, 0, -1},{0, 0, 1},{1, 0, 0},{-1, 0, 0},{0, 1, 0},{0, -1, 0}};///移动数组

bool Isin(int y, int x, int z){
    if(y < 0 || y >= N || x < 0 || x >= N || z < 0 || z >= N)
        return false;
    return true;
}

int bfs(int y, int x, int z){
    queue <node> q;
    node a,b;
    a.init(y, x, z);
    while(!q.empty())
        q.pop();
    vis[a.y][a.x][a.z] = 1;
    q.push(a);
    while(!q.empty()){
        a = q.front();
        q.pop();
        if(a.x == x2 && a.y == y2 && a.z == z2) return 1;
        for(int i=0; i<6; i++){
            int yy = a.y + dir[i][0];
            int xx = a.x + dir[i][1];
            int zz = a.z + dir[i][2];
            b.init(yy, xx, zz);
            if(!vis[yy][xx][zz] && Isin(yy,xx,zz) && map[zz][yy][xx] != 'X'){
                vis[yy][xx][zz] = 1;
                dis[yy][xx][zz] = dis[a.y][a.x][a.z] + 1;///最短距离的记录
                q.push(b);
            }
        }
    }
    return 0;
}

int main(){
//    freopen("in.txt", "r", stdin);
    while(~scanf("%s%d",str, &N)){
        for(int i=0; i<N; i++)
            for(int j=0; j<N; j++)
                for(int k=0; k<N; k++)
                    cin >> map[i][j][k];
        cin >> y1 >> x1 >> z1;
        cin >> y2 >> x2 >> z2;
        scanf("%s", str);
        memset(vis, 0, sizeof(vis));
        memset(dis,0, sizeof(dis));
        if(!bfs(y1,x1,z1))  puts("NO ROUTE");
        else    cout << N << " " << dis[y2][x2][z2] << endl;
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值