hdu1026广搜
#include <stdio.h> #define MAX_ 100000; char map[100][100]; typedef struct { int x ,y ,time ,front; }point; int dir[4][2] = {-1,0,0,1,1,0,0,-1} ,mintime[100][100]; int n , m ,I ,J; point arr[1000000]; void bfs () { while (I != J)//队列不为空 { point head = arr[I++]; for (int i = 0 ;i <= 3 ;i++) { int x = head.x + dir[i][0] ,y = head.y + dir[i][1]; if (x >= 0 && y >= 0 && x < m && y < n && map[x][y] != 'X') { point k; k.time = head.time + 1; if (map[x][y] != '.') k.time += map[x][y] - '0'; if(k.time < mintime[x][y])//若到达minttime[x][y]时间小于其他点到此点时间,此点入队 { mintime[x][y] = k.time; k.x = x ,k.y = y; k.front = I - 1; //printf("%d---%d---%d---%d\n",k.x ,k.y ,k.time ,k.front); arr[J++] = k; } } } } } int main() { while (scanf("%d %d",&m,&n) != EOF) { for (int i = 0 ;i < m ;i++) for (int j = 0 ;j < n ;j++) { scanf(" %c",&map[i][j]); mintime[i][j] = MAX_; } //队列第一个元素赋值 arr[0].x = m - 1 ,arr[0].y = n - 1 ,arr[0].time = 0 ,arr[0].front = -1 ,mintime[m-1][n-1] = 0; if (map[m-1][n-1] != 'X' && map[m-1][n-1] != '.') mintime[m - 1][n - 1] = arr[0].time = map[m-1][n-1] - '0'; I = 0 ,J = 1; int time = 1; //执行搜索 bfs (); //不能到达 if (mintime[0][0] == 100000) printf ("God please help our poor hero.\n"); else { printf ("It takes %d seconds to reach the target position, let me show you the way.\n",mintime[0][0]); point s = arr[I-1]; while (s.x != 0 || s.y !=0) s = arr[--I]; int p ,time = 1 ,x ,y; //打印路径 while (s.front >= 0) { p = s.front; x = arr[p].x ,y = arr[p].y; printf ("%ds:(%d,%d)->(%d,%d)\n",time++,s.x,s.y,x,y); if (map[x][y] != 'X' && map[x][y] != '.') for(int i = 1 ;i <= map[x][y] - '0' ;i++) printf("%ds:FIGHT AT (%d,%d)\n",time++,x,y); s = arr[p]; } } printf ("FINISH\n"); } return 0; }