• 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
    ");
    119         else
    120             printf("NO
    ");
    121     }
    122     return 0;
    123 }
    View Code
  • 相关阅读:
    在腾讯云上使用URLOS一键安装Discuz! Q
    共享容器——URLOS最新发布的一项超强功能
    在群晖NAS上运行URLOS之后竟然能安装Discuz! Q!!
    Discuz!Q回归,如何一键安装Discuz!Q
    Docker管理面板-URLOS(易用、高效、强大)
    CentOS下Subversion(SVN)的快速安装与配置
    通过URLOS安装Redis缓存为wordpress网站提速
    5分钟快速安装Redmine项目管理软件
    Python3+HTMLTestRunner+SMTP生成测试报告后发送邮件
    Python3+HTMLTestRunner生成html测试报告时报错HTMLTestRunner.py line 687, in generateReport  self.stream.write(output.encode('utf8'))
  • 原文地址:https://www.cnblogs.com/dybala21/p/10099560.html
Copyright © 2020-2023  润新知