zoukankan      html  css  js  c++  java
  • #搜索# #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 }
  • 相关阅读:
    day1-字符串拼接、表达式、break和continue
    ssh免密登录
    1-5 文档的基本 CRUD 与批量操作
    1-4 安装logstash
    1-3 安装cerebro
    1-2 kibana 7.5.1 安装配置
    1-1 elasticsearch7.5 集群搭建 es 7
    生产环境k8s集群搭建
    Gearman任务分布系统部署windows平台_使用Cygwin
    [转载]单元测试之道(使用NUnit)
  • 原文地址:https://www.cnblogs.com/wjting/p/6008427.html
Copyright © 2011-2022 走看看