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; 
}

 

posted @ 2013-04-14 15:22  宛如  阅读(149)  评论(0编辑  收藏  举报