zoukankan      html  css  js  c++  java
  • HDU 1026 Ignatius and the Princess I

    广搜的一个简单变形,思路还是一样的,依旧是维护一个队列,将一个节点不断的扩展,扩展完后出队。

    这道题还有两个特点就是:可能遇到怪兽,因此需要额外花费n秒的时间来打败它。

    最终还要输出路径。

    因此结构体里面prex 和 prey就是来记录下一个格子的坐标的。

    因为有了怪兽所以我们不能一搜到起点就退出搜索,因为可能存在其他更快的路径,所以要全部搜完。

      1 //#define LOCAL
      2 #include <iostream>
      3 #include <cstdio>
      4 #include <cstring>
      5 #include <queue>
      6 using namespace std;
      7 
      8 const int MAX = 100000000;
      9 int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
     10 int row, col;
     11 
     12 struct st
     13 {
     14     char cc;
     15     int num, x, y, prex, prey;
     16 }map[105][105];
     17 
     18 bool isdigit(char c)
     19 {
     20     return (c >= '0' && c <= '9');
     21 }
     22 
     23 void OutPut(void)
     24 {
     25     if(map[0][0].num != MAX)
     26     {
     27         int x = 0, y = 0, a, b, steps = 1;
     28         printf("It takes %d seconds to reach the target position, let me show you the way.
    ", map[0][0].num);
     29         while(x < row - 1 || y < col - 1)
     30         {
     31             a = map[x][y].prex, b = map[x][y].prey;
     32             if(isdigit(map[x][y].cc))
     33                 for(int i = 0; i < map[x][y].cc - '0'; ++i)
     34                     printf("%ds:FIGHT AT (%d,%d)
    ", steps++, x, y);
     35             printf("%ds:(%d,%d)->(%d,%d)
    ", steps++, x, y, a, b);
     36             x = a, y = b;
     37         }
     38         if(isdigit(map[x][y].cc))
     39             for(int i = 0; i < map[x][y].cc - '0'; ++i)
     40                 printf("%ds:FIGHT AT (%d,%d)
    ", steps++, x, y);
     41         printf("FINISH
    ");
     42     }
     43     else
     44         printf("God please help our poor hero.
    FINISH
    ");
     45 }
     46 
     47 void BFS(void)
     48 {
     49     int temp;
     50     st first;
     51     queue<st> qu;
     52     map[row-1][col-1].num = 0;
     53     if(isdigit(map[row-1][col-1].cc))
     54         map[row-1][col-1].num = map[row-1][col-1].cc - '0';
     55     qu.push(map[row-1][col-1]);
     56     while(!qu.empty())
     57     {
     58         first = qu.front();
     59         for(int i = 0; i < 4; ++i)
     60         {
     61             int tx = first.x + dir[i][0];
     62             int ty = first.y + dir[i][1];
     63             if(tx<0 || tx>=row || ty<0 || ty>=col || map[tx][ty].cc == 'X')
     64                 continue;
     65             temp = first.num;
     66             if(isdigit(map[tx][ty].cc))
     67                 temp += map[tx][ty].cc - '0';
     68             if(temp + 1 < map[tx][ty].num)
     69             {
     70                 map[tx][ty].num = temp + 1;
     71                 map[tx][ty].prex = first.x;
     72                 map[tx][ty].prey = first.y;
     73                 qu.push(map[tx][ty]);
     74             }
     75         }
     76         qu.pop();
     77     }
     78     OutPut();
     79 }
     80 
     81 int main(void)
     82 {
     83     #ifdef LOCAL
     84         freopen("1026in.txt", "r", stdin);
     85     #endif
     86 
     87     while(scanf("%d%d", &row, &col) == 2)
     88     {
     89         getchar();
     90         for(int i = 0; i < row; ++i)
     91         {
     92             for(int j = 0; j < col; ++j)
     93             {
     94                 scanf("%c", &map[i][j].cc);
     95                 map[i][j].x = i;
     96                 map[i][j].y = j;
     97                 map[i][j].num = MAX;
     98                 map[i][j].prex = map[i][j].prey = -1;
     99             }
    100             getchar();
    101         }
    102         BFS();
    103     }
    104     return 0;
    105 }
    代码君
  • 相关阅读:
    解决android模拟器太大,小屏幕无法完全显示的问题
    寡人写的第一个HTML5页面
    android开发环境重装系统之后的配置
    PHP程序的一次重构记录
    重构遗留代码(1):金牌大师
    java加密算法研究
    理解Java常量池
    由一个项目看java TCP/IP Socket编程
    java List分组和排序处理
    JAVA获取方法参数名的分析(一)
  • 原文地址:https://www.cnblogs.com/AOQNRMGYXLMV/p/3911429.html
Copyright © 2011-2022 走看看