• HDOJ_ACM_A计划


    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
     

     

    Idea

    For this question, using flags[][], which mark wheather u passed or not, using dfs find the shortest path. U should care about more details, such as using flag to mark whether u find it, using outOfTime to mark whether the time is used up.

     

    Code

    View Code
      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <queue>
      4 using namespace std;
      5 #define N 10
      6 #define M 10
      7 struct Position
      8 {
      9     int x;
     10     int y;
     11     int step;
     12     int floornum;
     13 };
     14 struct
     15 {
     16     char map[N + 2][M + 2];
     17     int flags[N + 2][M + 2];
     18 }floors[2];
     19 int dx[5] = {1, -1, 0, 0};
     20 int dy[5] = {0, 0, 1, -1};
     21 int main()
     22 {
     23     int c, n, m, t, flag, outOfTime, floornum, result, i, j;
     24     Position source, des, pre, cur;
     25     scanf("%d", &c);
     26     while (c--)
     27     {
     28         queue<Position> q;
     29         scanf("%d %d %d", &n, &m, &t);
     30         getchar();
     31         for (floornum = 0; floornum < 2; floornum++)
     32         {
     33             for (i = 0; i < n; i++)
     34             {
     35                 //input
     36                 scanf("%s", floors[floornum].map[i]);
     37                 //initialize
     38                 for (j = 0; j < m; j++)
     39                     floors[floornum].flags[i][j] = 0;
     40             }
     41         }
     42         //printf("input successfully\n");
     43         source.x = 0;
     44         source.y = 0;
     45         source.step = 0;
     46         source.floornum = 0;
     47         q.push(source);
     48         flag = 0;        //mark whether find it or not
     49         outOfTime = 0;   //mark whether the time is used up or not
     50         floors[0].map[0][0] = 1;
     51         //printf("go to queue\n");
     52         while (!q.empty() && !flag && !outOfTime)
     53         {
     54             pre = q.front();
     55             q.pop();
     56             //printf("pop(): x = %d, y = %d, floornum = %d, step = %d\n", pre.x, pre.y, pre.floornum, pre.step);
     57             for (i = 0; i < 4; i++)
     58             {
     59                 //get the current
     60                 cur.x = pre.x + dx[i];
     61                 cur.y = pre.y + dy[i];
     62                 cur.step = pre.step + 1;
     63                 cur.floornum = pre.floornum;
     64                 //out of index
     65                 if (cur.x < 0 || cur.x >= n || cur.y < 0 || cur.y >= m)
     66                     continue;
     67                 //if the position has passed
     68                 if (floors[cur.floornum].flags[cur.x][cur.y] == 1)
     69                     continue;
     70                 //out of time
     71                 if (cur.step > t)
     72                 {
     73                     outOfTime = 1;
     74                     break;
     75                 }
     76                 //go the other floor
     77                 if (floors[cur.floornum].map[cur.x][cur.y] == '#')
     78                 {
     79                     floors[cur.floornum].flags[cur.x][cur.y] = 1;
     80                     cur.floornum = 1 - cur.floornum;
     81                 }
     82                 if (floors[cur.floornum].map[cur.x][cur.y] == 'P')
     83                 {
     84                     flag = 1;
     85                     result = cur.step;
     86                     break;
     87                 }
     88                 //
     89                 else if (floors[cur.floornum].map[cur.x][cur.y] == '.')
     90                 {
     91                     floors[cur.floornum].flags[cur.x][cur.y] = 1;
     92                     q.push(cur);
     93                     //printf("push(): x = %d, y = %d, floornum = %d, step = %d\n", cur.x, cur.y, cur.floornum, cur.step);
     94                 }
     95             }
     96         } 
     97         if (flag == 0)
     98             printf("NO\n");
     99         else if (outOfTime == 1)
    100             printf("NO\n");
    101         else if (flag == 1 && outOfTime == 0)
    102             printf("YES\n");
    103     }
    104     system("pause");
    105     return 0;
    106 }
     

  • 相关阅读:
    springboot的@ConditionalOnBean注解
    深入理解springboot的自动注入
    在线就能用的 SQL 练习平台(附SQL学习文档)
    数据智能——DTCC2022!中国数据库技术大会即将开幕
    Flex & Bison 开始
    架构师的快速成长 lcl
    隐私计算FATE离线预测
    求求你们,别再刷 Star 了!这跟“爱国”没关系!
    tauri+vue开发小巧的跨OS桌面应用股票体检
    从区划边界geojson中查询经纬度坐标对应的省市区县乡镇名称,开源Java工具,内存占用低、高性能
  • 原文地址:https://www.cnblogs.com/chuanlong/p/3017310.html
Copyright © 2020-2023  润新知