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.\n", 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)\n", steps++, x, y);

 35             printf("%ds:(%d,%d)->(%d,%d)\n", 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)\n", steps++, x, y);

 41         printf("FINISH\n");

 42     }

 43     else

 44         printf("God please help our poor hero.\nFINISH\n");

 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 }
代码君

 

你可能感兴趣的:(HDU)