hdu 2425 Hiking Trip (dfs)

来源:互联网 发布:mysql 主从切换 编辑:程序博客网 时间:2024/05/16 08:33

HDU 2425 Hiking Trip (dfs)

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

//题目的意思大概就是要我们找一条从(sc,sr)(tc,tr)的路径使得时间最少

//这一点就是和别的题目不太一样了,因为我们一般bfs都是以步数为标准的,

//而且都是+1的,这里要每一次把队列以时间为标准排一下序

//要谢谢我们吴老板给我们的这个Stl

/*

优先队列priority_queue:(自动排列的队列)

 

 struct node

 {

 friend bool operator< (node n1, node n2)

 {

 return n1.time < n2.time;

 }

 int i,j;

 int time;

 };

 priority_queue<node, vector<node>, greater<node> >q;

 其中

 第二个参数为容器类型。

 第三个参数为比较函数。

*/

#include<iostream>

#include<queue>

#include<cmath>

using namespace std;

char map[22][22]; //地图

int visit[22][22]; //标记是否走过

int dir[][2]={0,1,1,0,-1,0,0,-1};//四个方向

struct node

{

      friend bool operator> (node n1, node n2) //这里是<的时候编译不过,不解T_T...

      {

             return n1.time > n2.time;

      }    

      int x,y;

      int time;

};

int cases,i,j;

int r,c;

int vp,vs,vt;  //三种字符要用的时间

int sc,sr,tc,tr; //起点和终点

int stone;

void bfs();

int main()

{

      cases=0;

      while(scanf("%d%d",&r,&c)!=EOF)

      {

             cases++;

             stone=0;

             scanf("%d%d%d",&vp,&vs,&vt);

             getchar(); // 吃掉回车

             for(i=0;i<r;i++)

             {

                    for(j=0;j<c;j++)

                    {

                           scanf("%c",&map[i][j]);

                           if(map[i][j]=='@')

                           {

                                  stone++;    // 统计石头,剪枝

                           }

                           visit[i][j]=0;

                    }

                           getchar();//每行吃掉回车

             }

             scanf("%d%d%d%d",&sr,&sc,&tr,&tc);

             if(abs(sr-tr)+abs(sc-tc)+stone>=r*c)//剪枝

             {

                    printf("Case %d: %d/n",cases,-1);

                    continue;

             }

             bfs();

      }

      return 0;

}

void bfs()

{

      if(sr==tr&&sc==tc)

      {

                    printf("Case %d: %d/n",cases,0);

                    return ;

      }

      node start;

      start.x=sr;

      start.y=sc;

      start.time=0;

      priority_queue< node,vector<node>,greater<node> > q;

      //关键一步,因为入队之后要对时间小的先操作,来自Stl,学习了

      q.push(start);

      visit[sr][sc]++;

      node t,temp;

      while(!q.empty())

      {

             t=q.top();

             q.pop();

             for(i=0;i<4;i++)

             {

                    temp=t;

                    temp.x+=dir[i][0];

                    temp.y+=dir[i][1];

                    if(temp.x>=r||temp.x<0 || temp.y>=c||temp.y<0 ||

 map[temp.x][temp.y]=='@' ||

 visit[temp.x][temp.y]>0)

                    //判断边界、是不是石头、是不是用过了

                    {

                           continue;

                    }

                    switch(map[temp.x][temp.y])           //计算时间变化

                    {

                    case '#': temp.time += vp; break; 

                    case '.': temp.time += vs; break; 

                    case 'T': temp.time += vt; break; 

                    }

                    if (temp.x == tr && temp.y == tc)   //找到目标

                    {

                           printf("Case %d: %d/n", cases, temp.time); 

                           return;

                    }

                    else //入队

                    {

                           q.push(temp);

                           visit[temp.x][temp.y] ++;

                    }

 

             }

 

      }

      printf("Case %d: %d/n", cases, -1);

}

 

原创粉丝点击