http://acm.hdu.edu.cn/showproblem.php?pid=1026

模拟一个人走迷宫,起点在(0,0)位置,遇到怪兽要和他决斗,决斗时间为那个格子的数字,就是走一个格子花费时间1,

遇到有数字的格子还要花费这个数字大小的时间,输出最后走到(n-1,m-1)的最小时间,还要输出他的路径,'X'是墙,‘.’是可以走的空地

就是这个路径,刚一看题看到那个样例输出吓得我都飞起来了,好多啊!

其实还好啦,广搜,一开始还因为是普通的广搜,后来发现不一样,

为了寻求最小时间,他可以选择走有数字的格子也可以选择绕过去,看哪个时间短一些

首先求出最小时间,跟那个连连看差不多,用visit数组初始化很大,来储存到达每个点的最小时间

然后输出路径的时候用递归回溯,因为广搜是广泛的搜索,并不能保证走过的点都是最短路径上的点

所以从终点开始利用他的方向来往前回溯,注意因为没有用优先队列和输出漏了句号所以刚开始wa了几发

code

  1 #include<cstdio>
  2 #include<climits>
  3 #include<queue>
  4 #include<cstring>
  5 using namespace std;
  6 char map[111][111];
  7 int visit[111][111];
  8 int flag[111][111];
  9 struct point{
 10     int x,y;
 11     int time;
 12     friend bool operator<(point n1,point n2)
 13     {
 14         return n2.time<n1.time;
 15     }
 16 };
 17 int n,m,t;
 18 int dx[]={1,0,0,-1};
 19 int dy[]={0,-1,1,0};
 20 int bfs()
 21 {
 22     int i;
 23     priority_queue<point>Q;
 24     point now,next;
 25     now.x=0;now.y=0;
 26     now.time=0;
 27     visit[0][0]=0;
 28     Q.push(now);
 29     while (!Q.empty())
 30     {
 31         now=Q.top();
 32         Q.pop();
 33         if (now.x==n-1&&now.y==m-1)
 34             return visit[now.x][now.y];
 35         for (i=0;i<4;i++)
 36         {
 37             next.x=now.x+dx[i];
 38             next.y=now.y+dy[i];
 39             if (next.x<0||next.x>=n||next.y<0||next.y>=m)continue;
 40             if (map[next.x][next.y]=='X')continue;
 41             if (map[next.x][next.y]=='.')
 42                  next.time=now.time+1;
 43             else
 44                  next.time=now.time+1+(map[next.x][next.y]-'0');
 45             if (map[next.x][next.y]<='9'&&map[next.x][next.y]>='1'&&visit[next.x][next.y]>now.time+(map[next.x][next.y]-'0'))
 46             {
 47                  visit[next.x][next.y]=now.time+1+(map[next.x][next.y]-'0');
 48                  flag[next.x][next.y]=i+1;
 49                  Q.push(next);
 50             }
 51             else if (map[next.x][next.y]=='.'&&visit[next.x][next.y]>now.time+1)
 52             {
 53                 visit[next.x][next.y]=now.time+1;
 54                 flag[next.x][next.y]=i+1;
 55                 Q.push(next);
 56             }
 57         }
 58     }
 59     return -1;
 60 }
 61 void output(int x,int y)//回溯
 62 {
 63     int sx,sy;
 64     if (flag[x][y]==0)  return ;
 65     sx=x-dx[flag[x][y]-1];
 66     sy=y-dy[flag[x][y]-1];
 67     output(sx,sy);
 68     printf("%ds:(%d,%d)->(%d,%d)\n",t++,sx,sy,x,y);
 69     if (map[x][y]<='9'&&map[x][y]>='0')
 70     {
 71         int w=map[x][y]-'0';
 72         while (w--)
 73             printf("%ds:FIGHT AT (%d,%d)\n",t++,x,y);
 74     }
 75 }
 76 int main()
 77 {
 78     int i,j,q;
 79     while (~scanf("%d %d",&n,&m))
 80     {
 81         getchar();
 82         for (i=0;i<n;i++)
 83         {
 84             for (j=0;j<m;j++)
 85                 scanf(" %c",&map[i][j]);
 86         }
 87         for (i=0;i<n;i++)
 88         for (j=0;j<m;j++)
 89         {
 90             visit[i][j]=INT_MAX;
 91             flag[i][j]=0;
 92         }
 93         q=bfs();
 94         if (q==-1)
 95         {
 96             puts("God please help our poor hero.");
 97             puts("FINISH");
 98         }
 99         else
100         {
101             printf("It takes %d seconds to reach the target position, let me show you the way.\n",q);
102             t=1;
103             output(n-1,m-1);
104             puts("FINISH");
105         }
106     }
107     return 0;
108 }

 

posted on 2015-08-04 15:38  蜘蛛侦探  阅读(331)  评论(0编辑  收藏  举报