HDU_2102 A计划 【BFS】

一、题目

HDU2102

二、题意分析

该题其实就是三位空间内的BFS,但比较简单的是,它设置了传送门,可以直接传送上去,需要注意的是

1.到了传送门的时候要重新考虑传送的点的三种情况。

  (1)若又是传送门,这两个点都可以不再考虑了。

  (2)若是墙,如题意,直接pass掉。

  (3)若是P,找到了。

2.在T之前找到公主后也是可以的合理解释是不是骑士和公主可以在那里聊到T时刻?

三、AC代码

  1 #include <cstdio>
  2 #include <iostream>
  3 #include <cstring>
  4 #include <fstream>
  5 #include <queue>
  6
  7 using namespace std;
  8
  9 int N, M, T;
 10 const int dx[] = {0, 0, 1, -1};
 11 const int dy[] = {1, -1, 0, 0};
 12 char Map[3][15][15];
 13 bool visit[3][15][15];
 14 struct Node
 15 {
 16     int level, x, y;
 17 }S, P;
 18 // Node Q[1000000];
 19 // int Rea, Cnt;
 20 bool judge(Node t)
 21 {
 22     if(t.level < 0 || t.level >= 2 || t.x < 0 || t.x >= N || t.y < 0 || t.y >= M
 23     || Map[t.level][t.x][t.y] == ‘*‘ || visit[t.level][t.x][t.y] == 1)
 24         return false;
 25     return true;
 26 }
 27
 28 bool BFS()
 29 {
 30     memset(visit, 0, sizeof(visit));
 31     queue<Node> Q;
 32     Q.push(S);
 33
 34     // Cnt = Rea = 0;
 35     // Q[Cnt++] = S;
 36     visit[S.level][S.x][S.y] = 1;
 37
 38     for(int t = 1; t <= T; t++)
 39     {
 40         int size = (int)Q.size();
 41         //int size = Cnt - Rea;
 42         while(size--)
 43         {
 44             Node cur = Q.front();
 45             Q.pop();
 46             //Node cur = Q[Rea++];
 47
 48             for(int i = 0; i < 4; i++)
 49             {
 50                 Node next = cur;
 51                 next.x += dx[i];
 52                 next.y += dy[i];
 53                 if(judge(next))
 54                 {
 55                     if(Map[next.level][next.x][next.y] == ‘#‘)
 56                     {
 57                         visit[next.level][next.x][next.y] = 1;
 58                         next.level++;
 59                         next.level%=2;
 60                         if(!judge(next))
 61                             continue;
 62                     }
 63                     if(Map[next.level][next.x][next.y] == ‘#‘)
 64                     {
 65                         visit[next.level][next.x][next.y] = 1;
 66                         continue;
 67                     }
 68                     else if(Map[next.level][next.x][next.y] == ‘P‘)
 69                     {
 70                         return true;
 71                     }
 72                     else
 73                     {
 74                         visit[next.level][next.x][next.y] = 1;
 75                         Q.push(next);
 76                     }
 77                     //Q[Cnt++] = next;
 78                 }
 79             }
 80         }
 81     }
 82     return false;
 83
 84 }
 85
 86 int main()
 87 {
 88     //freopen("input.txt", "r", stdin);
 89     int C;
 90     scanf("%d", &C);
 91     while(C--)
 92     {
 93         scanf("%d %d %d", &N, &M, &T);
 94         for(int i = 0; i < 2; i++)
 95         {
 96             for(int j = 0; j < N; j++)
 97             {
 98                 scanf("%s", Map[i][j]);
 99                 for(int k = 0; k < M; k++)
100                 {
101                     if(Map[i][j][k] == ‘S‘)
102                     {
103                         S.level = i;
104                         S.x = j;
105                         S.y = k;
106                     }
107                     else if(Map[i][j][k] == ‘P‘)
108                     {
109                         P.level = i;
110                         P.x = j;
111                         P.y = k;
112                     }
113                 }
114             }
115             getchar();
116         }
117         if(BFS())
118             printf("YES\n");
119         else
120             printf("NO\n");
121     }
122     return 0;
123 }

原文地址:https://www.cnblogs.com/dybala21/p/10099560.html

时间: 2024-10-14 03:11:54

HDU_2102 A计划 【BFS】的相关文章

HDU-2102-A计划(BFS+优先队列)

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

HDU 2102 A计划 BFS

点击打开链接 A计划 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 10939    Accepted Submission(s): 2667 Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的

A计划(BFS)

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

HDU 2102 A计划 (BFS或DFS)

题意:中文题. 析:是一个简单的搜索,BFS 和 DFS都可行, 主要是这个题有一个坑点,那就是如果有一层是#,另一个层是#或者*,都是过不去的,就可以直接路过, 剩下的就是一个简单的搜索,只不过是两层而已,可能一个就是在#必须传送,这个题目已经说的很清楚了. 代码如下: BFS: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string>

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

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

HDOJ 2102 A计划(bfs)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 思路分析: <1>搜索方法分析:由于需要寻找最短的找到公主的路径,所以采用bfs搜索 <2>需要注意的地方: 1)如果当前状态为'#'字符,需要传送到另外一层,但是从该层到另外一层的时间是不会计算: 2)如果当前状态为'#'字符,则应该考虑该状态能否拓展:因为另一层的相同位置的字符可能为 'S','P','.','*'或者'#',所以对于另一层相同位置的字符可能的各种情况应该考虑

杭电2102--A计划(Bfs)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=2102 骑士救公主,迷宫问题.做的时候思路不清晰,一直Wa, 其实就是没搞清楚从posa-->posb无论b是传送门还是路都会耗时1, 只不过经过传送门又传送到了下一个位置:一直在这个误区里走不出来:Tmdi.bfs搜一遍就说明搜过来就说明posa一定为点,代码中又把特殊情况全部排除, 所以只有两种情况: '.' --->'#', '.'-->'.'(包含p, 为搜索结束条件), 瞬间明朗了很多啊

A计划(bfs)

A计划 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 2   Accepted Submission(s) : 1 Problem Description 可怜的公主在一次次被魔王掳走一次次被骑士们救回来之后,而今,不幸的她再一次面临生命的考验.魔王已经发出消息说将在T时刻吃掉公主,因为他听信谣言说吃公主的肉也能长生不老.年迈的国王正是心

hdoj 2102 A计划 【BFS】

题目:hdoj 2102 A计划点击打开链接 题意:中文的就不说了.求救出公主所需要的最短时间,所以用广搜. 分析:读题之后不难做,比一般的题目多了一个条件就是可以传送,那么我们可以在广搜里面加一个传送的条件就好了. 其次这个题目注意有个坑就是如果两边都是传送门的话也不行 还有注意广搜写法,如果把队列定义成全局的话注意清空!! #include <cstdio> #include <iostream> #include <queue> #include <cstr