HDU-#1240 Asteroids!(BFS)

题目大意:在一个三维的空间,给出起点和终点,问是否能够从起点到达终点,若能则输出n和步数,不能则NO ROUTE.

解题思路:BFS的应用。详见code。

题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=1240

code:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;

const int MAXN = 11;
int dir[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
char map[MAXN][MAXN][MAXN];
int sx,sy,sz,ex,ey,ez,n;
char str[10];

struct node{
    int x,y,z,step;
};

int BFS(){
    node t;
    node s;
    queue<node> q;
    s.x=sx;s.y=sy;s.z=sz; //初始化
    s.step=0;
    q.push(s);  //将起点放进队列中
    map[s.x][s.y][s.z]='*'; //访问过则标记
    while(!q.empty()){
        node temp=q.front();  //每次获取队首元素
        q.pop();
        if(temp.x==ex && temp.y==ey && temp.z==ez) return temp.step;  //如果搜索到终点,则返回走完的最短长度
        for(int i=0;i<6;i++){  //进行每层遍历
            t.x=temp.x+dir[i][0];
            t.y=temp.y+dir[i][1];
            t.z=temp.z+dir[i][2];
            t.step=temp.step+1;
            if(t.x>=0 && t.x<n && t.y>=0 && t.y<n &&t.z>=0 && t.z<n && map[t.x][t.y][t.z]=='O'){ //越界和条件判断
                map[t.x][t.y][t.z]='*';  //走过就标记
                q.push(t);  //将满足条件的点放入队列,进入下次循环判断
            }
        }
    }
    return -1;
}

int main()
{
    while(scanf("%s %d", str, &n) != EOF){
        for(int i = 0; i < n; i++)  //接收图,开始使用三层循环进行接收,然后结果始终不对,找了半天的错,最后换成两层循环一下就对了,想问有区别吗?汗。。
            for(int j = 0; j < n; j++)
                    scanf("%s", map[i][j]);
        scanf("%d %d %d %d %d %d", &sz, &sy, &sx, &ez, &ey, &ex);
        scanf("%s", str);
        int ans = BFS();  //BFS
        if(ans == -1)
            printf("NO ROUTE\n");
        else
            printf("%d %d\n", n, ans);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值