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 }