#搜索# #BFS# #优先队列# ----- OpenJudge鸣人和佐助

OpenJudge 6044:鸣人和佐助

总时间限制: 1000ms  内存限制: 65536kB
描述

佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢?

已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置。地图上的每个位置都可以走到,只不过有些位置上有大蛇丸的手下,需要先打败大蛇丸的手下才能到这些位置。鸣人有一定数量的查克拉,每一个单位的查克拉可以打败一个大蛇丸的手下。假设鸣人可以往上下左右四个方向移动,每移动一个距离需要花费1个单位时间,打败大蛇丸的手下不需要时间。如果鸣人查克拉消耗完了,则只可以走到没有大蛇丸手下的位置,不可以再移动到有大蛇丸手下的位置。佐助在此期间不移动,大蛇丸的手下也不移动。请问,鸣人要追上佐助最少需要花费多少时间?

输入
输入的第一行包含三个整数:M,N,T。代表M行N列的地图和鸣人初始的查克拉数量T。0 < M,N < 200,0 ≤ T < 10
后面是M行N列的地图,其中@代表鸣人,+代表佐助。*代表通路,#代表大蛇丸的手下。
输出
输出包含一个整数R,代表鸣人追上佐助最少需要花费的时间。如果鸣人无法追上佐助,则输出-1。
样例输入
样例输入1
4 4 1
#@##
**##
###+
****

样例输入2
4 4 2
#@##
**##
###+
****
样例输出
样例输出1
6

样例输出2
4


什么叫做没有记性呢(哦,刚刚被鉴定过我是没有脑子),就是真的一点印象都没有然后相关的内容一点都不知道。
就是有一种执念要先回忆BFS就是要用BFS写这题,然后就被各种dalao3D环绕版“一般,可行性问题用DFS,最优性问题用BFS。”好的,记住了。
然而这道题只用裸BFS是过不了的。为什么呢?dalao给出一个样例:

这样看来,并不能先进先出,元素存在优先级,于是优先队列就出现了。
/*
简单 介绍STL优先队列
  1. 包含头文件:#include<queue.h>
  2. 简单 常用操作:

    q.empty()         如果队列为空,则返回true,否则返回false

    q.size()            返回队列中元素的个数

    q.pop()             删除队首元素,但不返回其值

    q.top()             返回具有最高优先级的元素值,但不删除该元素

    q.push(item)     在基于优先级的适当位置插入新元素

  3. 默认队首为最大元素,若要改变需重载运算符

(说好的简单)*/

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<queue>
 5 using namespace std;
 6 
 7 int t,n,m;
 8 int flag,a=-1,b=-1,ans=-1;
 9 int h[4]={0,0,1,-1},s[4]={1,-1,0,0};
10 char map[205][205];
11 
12 struct node{
13     int u;
14     int v;
15     int w;
16     int c;
17     friend bool operator < (node a,node b){//重载运算符
18         if(a.w==b.w)return a.c>b.c ;
19         else return a.w>b.w;        
20     }
21 };
22 
23 priority_queue<node>qu;//定义类型
24 
25 void BFS(){
26     node head;
27     head.u=a;
28     head.v=b;
29     head.w=0;
30     head.c=0;
31     qu.push(head);
32     while(!qu.empty()){
33         node now=qu.top();//取队首元素
34         qu.pop();//队首元素弹出
35         for(int k=0;k<4;k++){
36             int U=now.u+h[k];
37             int V=now.v+s[k];
38             if(map[U][V]=='+'){
39                 ans=now.w+1;
40                 return ;
41             }
42             else if(map[U][V]=='*'){
43                  map[U][V]='-';
44                  node neww;
45                  neww.u=U;
46                  neww.v=V;
47                  neww.c=now.c;
48                  neww.w=now.w+1;
49                  qu.push(neww);
50             }
51             else if(map[U][V]=='#'&&(now.c+1)<=t){
52                 map[U][V]='-';
53                 node neww;
54                 neww.c=now.c+1;
55                 neww.u=U;
56                 neww.v=V;
57                 neww.w=now.w+1;
58                 qu.push(neww);
59             }
60         }
61     }
62 }
63 
64 int main(){
65     memset(map,'-',sizeof(map));
66     scanf("%d%d",&n,&m);
67     scanf("%d",&t);
68     for(int i=1;i<=n;i++){
69         scanf("%s",map[i]+1);
70         if(a==-1)
71             for(int j=1;j<=m;j++)
72                 if(map[i][j]=='@'){
73                     a=i;
74                     b=j;
75                 }
76     }
77     map[a][b]='-';
78     BFS();
79     printf("%d
",ans);
80     return 0;
81 }
原文地址:https://www.cnblogs.com/wjting/p/6008427.html