hdu2102 BFS

这是一道BFS的搜索题目,只是搜索范围变为了三维。定义数组visit[x][y][z]来标记空间位置,x表示楼层,y和z表示相应楼层的平面坐标。

#define _CRT_SECURE_NO_DEPRECATE
#include<iostream>
using namespace std;
#include<queue>
#define MAX_SIZE 12
int N, M, T;
char visit[2][MAX_SIZE][MAX_SIZE];
char map[2][MAX_SIZE][MAX_SIZE];
int dir[4][2] = { {0,1},{0,-1},{1,0},{-1,0} };
struct Point{
    int x, y, z, step;
    bool Isleg() {
        if ( y<0 || y>N-1||z<0||z>M-1||map[x][y][z]==‘*‘||visit[x][y][z])
            return false;
        return true;
    }
};
int BFS();
int main() {
    int i,c,res;
    scanf("%d", &c);
    while(c--){
        scanf("%d%d%d", &N, &M, &T);
        for (i = 0; i <N; i++)
            scanf("%s", map[0][i]);
        for (i =0; i < N;i++)
            scanf("%s",map[1][i]);
        res = BFS();
        if (res <= T)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}
int BFS() {
    Point next, pos;
    int k,i,j;
    for (i = 0; i < 2; i++) {
        for (k = 0; k <N; k++)
            for (j = 0; j <M; j++)
                visit[i][k][j] = 0;
    }
    pos.x = 0, pos.y = 0,pos.z=0;     //入口位置
    pos.step = 0;
    queue<Point>Q;
    Q.push(pos);                      //入口位置首先入队
    visit[pos.x][pos.y][pos.z] = 1;   //入口位置标记为访问
    while (!Q.empty()) {
        pos = Q.front();
        Q.pop();
        if (map[pos.x][pos.y][pos.z] == ‘P‘)
            return  pos.step;
        pos.step++;
        if (map[pos.x][pos.y][pos.z] == ‘#‘) {
            next = pos;
            next.x = (next.x + 1) % 2;       //进入下一层
            if (next.Isleg()) {
                visit[next.x][next.y][next.z] = 1;
                next.step--;         //时空传输不发费时间
                Q.push(next);
            }
        }
        else {
            for (k = 0; k < 4; k++) {     //扫描四个方向
                next = pos;
                next.y += dir[k][0];
                next.z += dir[k][1];
                if (next.Isleg()) {
                    visit[next.x][next.y][next.z] = 1;
                    Q.push(next);
                }
            }
        }
    }
    return INT_MAX;
}
时间: 2024-10-13 23:51:31

hdu2102 BFS的相关文章

HDU2102 A计划 BFS 简单题 有坑点 好题

Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.年迈的国王正是心急如焚,告招天下勇士来拯救公主.不过公主早已习以为常,她深信智勇的骑士LJ肯定能将她救出.现据密探所报,公主被关在一个两层的迷宫里,迷宫的入口是S(0,0,0),公主的位置用P表示,时空传输机用#表示,墙用*表示,平地用.表示.骑士们一进入时空传输机就会被转到另一层的相对位置

hdu2102(bfs)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 分析:bfs求最短时间到达'P'点,不过本题有好几个trick,我都踩到了,自己还是太嫩了... 注意:可能两层同个位置都是'#',还有经过'#'时只能被传送,不能经过它上下左右移动... #include <cstdio> #include <cstring> #include <cmath> #include <iostream> #include &

HDU2102 A计划

又一个三维迷宫,问题链接:HDU2102 A计划. 题意简述:虽然是三维迷宫,其实只有两层,骑士进入迷宫营救公主,找到公主即可.迷宫的入口是S(0,0,0),公主位置为'P',时空传输机为'#'表示,墙为'*'表示,平地为'.'.层间移动只能通过时空传输机,并且不需要时间.骑士在同一层中只能前后左右移动,每移动一格花1时刻.输入n,有n组测试数据,每个测试数据有一行三个整数N.M和T以及迷宫数据,迷宫大小为N*M(1 <= N,M <=10),需要在T时刻前找到公主.问能否在限定时间内找到公主

hdu2102

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2102 题目: A计划 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 8731    Accepted Submission(s): 2076 Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,

HDU_2102 A计划 【BFS】

一.题目 HDU2102 二.题意分析 该题其实就是三位空间内的BFS,但比较简单的是,它设置了传送门,可以直接传送上去,需要注意的是 1.到了传送门的时候要重新考虑传送的点的三种情况. (1)若又是传送门,这两个点都可以不再考虑了. (2)若是墙,如题意,直接pass掉. (3)若是P,找到了. 2.在T之前找到公主后也是可以的合理解释是不是骑士和公主可以在那里聊到T时刻? 三.AC代码 1 #include <cstdio> 2 #include <iostream> 3 #i

[hdu 2102]bfs+注意INF

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 感觉这个题非常水,结果一直WA,最后发现居然是0x3f3f3f3f不够大导致的--把INF改成INF+INF就过了. #include<bits/stdc++.h> using namespace std; bool vis[2][15][15]; char s[2][15][15]; const int INF=0x3f3f3f3f; const int fx[]={0,0,1,-1};

BFS+康托展开(洛谷1379 八数码难题)

在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变. 输入格式: 输入初试状态,一行九个数字,空格用0表示 输出格式: 只有一行,该行只有一个数字,表示从初始状态到目标状态需要的最少移动次数(测试数据中无特殊无法到达目标状态数据) 输入样例#1: 2831

Sicily 1444: Prime Path(BFS)

题意为给出两个四位素数A.B,每次只能对A的某一位数字进行修改,使它成为另一个四位的素数,问最少经过多少操作,能使A变到B.可以直接进行BFS搜索 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 bool isPrime(int n){//素数判断 5 if(n == 2 || n == 3) return true; 6 else{ 7 int k = sqrt(n) + 1; 8 for(int i = 2; i < k; i

HDU 5925 Coconuts 【离散化+BFS】 (2016CCPC东北地区大学生程序设计竞赛)

Coconuts Time Limit: 9000/4500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 524    Accepted Submission(s): 151 Problem Description TanBig, a friend of Mr. Frog, likes eating very much, so he always has dreams abou