HUD2102(基础bfs)

A计划

Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 16914    Accepted Submission(s): 4251

Problem Description

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

Input

输入的第一行C表示共有C个测试数据,每个测试数据的前一行有三个整数N,M,T。 N,M迷宫的大小N*M(1 <= N,M <=10)。T如上所意。接下去的前N*M表示迷宫的第一层的布置情况,后N*M表示迷宫第二层的布置情况。

Output

如果骑士们能够在T时刻能找到公主就输出“YES”,否则输出“NO”。

Sample Input

1

5 5 14

S*#*.

.#...

.....

****.

...#.

..*.P

#.*..

***..

...*.

*.#..

Sample Output

YES

#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int MAXN=15;
struct Node{
    int x,y,z,step;
    Node(){}
    Node(int z,int y,int x,int step)
    {
        this->x=x;
        this->y=y;
        this->z=z;
        this->step=step;
    }
};
int n,m,limit;
char mz[2][MAXN][MAXN];
int vis[2][MAXN][MAXN];
int dy[4]={0,1,0,-1};
int dx[4]={1,0,-1,0};
void bfs()
{
    memset(vis,0,sizeof(vis));
    queue<Node> que;
    que.push(Node(0,0,0,0));
    vis[0][0][0]=1;
    while(!que.empty())
    {
        Node now=que.front();que.pop();
        if(mz[now.z][now.y][now.x]==‘P‘)
        {
            printf("YES\n");
            return ;
        }
        for(int i=0;i<4;i++)
        {
            int ny=dy[i]+now.y;
            int nx=dx[i]+now.x;
            int ns=now.step+1;
            if(0<=ny&&ny<n&&0<=nx&&nx<m&&mz[now.z][ny][nx]!=‘*‘&&!vis[now.z][ny][nx]&&ns<=limit)
            {
                vis[now.z][ny][nx]=1;
                if(mz[now.z][ny][nx]==‘#‘)
                {
                    int opposite=(now.z==1?0:1);
                    if(mz[opposite][ny][nx]!=‘*‘&&mz[opposite][ny][nx]!=‘#‘)//防止进入两层相对位置均为时光机
                    {
                        vis[opposite][ny][nx]=1;
                        que.push(Node(opposite,ny,nx,now.step+1));
                    }
                }
                else
                {
                    que.push(Node(now.z,ny,nx,now.step+1));
                }
            }
        }
    }
    printf("NO\n");
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d%d",&n,&m,&limit);
        for(int k=0;k<2;k++)
        {
            for(int i=0;i<n;i++)
            {
                scanf("%*c");
                for(int j=0;j<m;j++)
                {
                    scanf("%c",&mz[k][i][j]);
                }
            }
            scanf("%*c");
        }
        bfs();
    }
    return 0;
}
时间: 2024-08-09 08:08:39

HUD2102(基础bfs)的相关文章

hdu1241 基础BFS

题意:问整个图中有几个油田,油田的八个方向都算同一块. 思路:先找到一个油田,进行BFS搜索,找到一个就标记一个,知道找不到位置.再找一个油田搜索.如此下去就可以找到所有的 #include<cstdio> #include<cstring> #include<queue> struct node { int x,y; node(int x = 0,int y = 0) : x(x),y(y){} }; const int maxn = 200; int dx[8] =

POJ 3287 (基础BFS) Catch That Cow

这是做的第一道BFS,很基础很简单的题目 广度优先搜索算法如下:(用QUEUE)(1) 把初始节点S0放入Open表中:(2) 如果Open表为空,则问题无解,失败退出:(3) 把Open表的第一个节点取出放入Closed表,并记该节点为n:(4) 考察节点n是否为目标节点.若是,则得到问题的解,成功退出:(5) 若节点n不可扩展,则转第(2)步:(6) 扩展节点n,将其不在Closed表和Open表中的子节点(判重)放入Open表的尾部,并为每一个子节点设置指向父节点的指针(或记录节点的层次)

HDU 1312 Red and Black(基础bfs或者dfs)

Red and Black Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 11843    Accepted Submission(s): 7380 Problem Description There is a rectangular room, covered with square tiles. Each tile is color

POJ9384 迷宫问题(基础BFS)

本文出自:http://blog.csdn.net/svitter 题目:让你从(0, 0)走到(4,4),并且输出路径.输入数据:二位数组的迷宫:输出数据:路径: 题解:简单的BFS 注意: 1.去重: 2.墙不能走: 3.记录前一个节点 代码: #include <iostream> #include <stdio.h> #include <string.h> using namespace std; int maze[6][6]; bool visit[5][5]

二叉树的遍历方法之层序-先序-中序-后序遍历的简单讲解和代码示例

二叉树的基础性质及二叉树的建立参见前面两篇博文: http://blog.csdn.net/why850901938/article/details/51052936 http://blog.csdn.net/why850901938/article/details/51052156 首先为了讲解方便,我建立了如图所示的二叉树: 取名为:树A 1.何为层序遍历? 层序遍历就是按照二叉树的层次由上到下的进行遍历,每一层要求访问的顺序为从左到右: 以树A为例,层序遍历得到的结果为: 5 2 6 1

java web 开发三剑客 -------电子书

Internet,人们通常称为因特网,是当今世界上覆盖面最大和应用最广泛的网络.根据英语构词法,Internet是Inter + net,Inter-作为前缀在英语中表示“在一起,交互”,由此可知Internet的目的是让各个net交互.所以,Internet实质上是将世界上各个国家.各个网络运营商的多个网络相互连接构成的一个全球范围内的统一网,使各个网络之间能够相互到达.各个国家和运营商构建网络采用的底层技术和实现可能各不相同,但只要采用统一的上层协议(TCP/IP)就可以通过Internet

ZOJ - 3890 Wumpus(BFS基础题)

Wumpus Time Limit: 2 Seconds      Memory Limit: 65536 KB One day Leon finds a very classic game called Wumpus.The game is as follow. Once an agent fell into a cave. The legend said that in this cave lived a kind of monster called Wumpus, and there we

HDU 1548 (最基础的BFS了) A strange lift

这是一维的BFS,而且没有什么变形,应该是最基础的BFS了吧 题意: 有这样一个奇葩的电梯,你在第i层的时候你只能选择上或者下Ki层,也就是你只能从第i层到达i+Ki或者i-Ki层.当然电梯最低只能在1层最高只能在n层. 给出起点和终点问最少需要多少次才能到达终点,如果不能到达输出-1 没有什么好解释的了,如此单纯的一道题,只要不是太粗心就能A过去 1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #incl

Clone Graph leetcode java(DFS and BFS 基础)

题目: Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors. OJ's undirected graph serialization: Nodes are labeled uniquely. We use # as a separator for each node, and , as a separator for node label and each n