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. 默认队首为最大元素,若要改变需重载运算符

(说好的简单)*/

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std; int t,n,m;
int flag,a=-,b=-,ans=-;
int h[]={,,,-},s[]={,-,,};
char map[][]; struct node{
int u;
int v;
int w;
int c;
friend bool operator < (node a,node b){//重载运算符
if(a.w==b.w)return a.c>b.c ;
else return a.w>b.w;
}
}; priority_queue<node>qu;//定义类型 void BFS(){
node head;
head.u=a;
head.v=b;
head.w=;
head.c=;
qu.push(head);
while(!qu.empty()){
node now=qu.top();//取队首元素
qu.pop();//队首元素弹出
for(int k=;k<;k++){
int U=now.u+h[k];
int V=now.v+s[k];
if(map[U][V]=='+'){
ans=now.w+;
return ;
}
else if(map[U][V]=='*'){
map[U][V]='-';
node neww;
neww.u=U;
neww.v=V;
neww.c=now.c;
neww.w=now.w+;
qu.push(neww);
}
else if(map[U][V]=='#'&&(now.c+)<=t){
map[U][V]='-';
node neww;
neww.c=now.c+;
neww.u=U;
neww.v=V;
neww.w=now.w+;
qu.push(neww);
}
}
}
} int main(){
memset(map,'-',sizeof(map));
scanf("%d%d",&n,&m);
scanf("%d",&t);
for(int i=;i<=n;i++){
scanf("%s",map[i]+);
if(a==-)
for(int j=;j<=m;j++)
if(map[i][j]=='@'){
a=i;
b=j;
}
}
map[a][b]='-';
BFS();
printf("%d\n",ans);
return ;
}

#搜索# #BFS# #优先队列# ----- OpenJudge鸣人和佐助的更多相关文章

  1. OpenJ_Bailian——4115鸣人和佐助(带状态的A*)

    鸣人和佐助 Time Limit: 1000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Submit Status Desc ...

  2. [NOI OJ]6044:鸣人和佐助

    6044:鸣人和佐助 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 已知一张地图(以二维矩阵的形式表示) ...

  3. noi openjudge 6044:鸣人和佐助

    http://noi.openjudge.cn/ch0205/6044/ 描述佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个 ...

  4. NOI / 2.5基本算法之搜索-6044:鸣人和佐助详解

    总时间限制: 1000ms 内存限制: 65536kB 题目 佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到, ...

  5. [openjudge-搜索]广度优先搜索之鸣人和佐助

    题目描述 描述 佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢?已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到,只不过有些位置上有大蛇丸的手下,需要先打败大蛇丸 ...

  6. BFS:noi6044鸣人与佐助

    PS:一道XX到我心态崩溃的好(傻逼)题. 先粘题目: 佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到,只不过 ...

  7. HDU 1428 漫步校园 (BFS+优先队列+记忆化搜索)

    题目地址:HDU 1428 先用BFS+优先队列求出全部点到机房的最短距离.然后用记忆化搜索去搜. 代码例如以下: #include <iostream> #include <str ...

  8. hdu1839(二分+优先队列,bfs+优先队列与spfa的区别)

    题意:有n个点,标号为点1到点n,每条路有两个属性,一个是经过经过这条路要的时间,一个是这条可以承受的容量.现在给出n个点,m条边,时间t:需要求在时间t的范围内,从点1到点n可以承受的最大容量... ...

  9. HDU 1242 -Rescue (双向BFS)&amp;&amp;( BFS+优先队列)

    题目链接:Rescue 进度落下的太多了,哎╮(╯▽╰)╭,渣渣我总是埋怨进度比别人慢...为什么不试着改变一下捏.... 開始以为是水题,想敲一下练手的,后来发现并非一个简单的搜索题,BFS做肯定出 ...

随机推荐

  1. Hadoop集群搭建的密钥配置SSH实现机制的配置(2)

    [hadoop@weekend110 ~]$ ssh-keygen -t rsa 用来生产密钥对 Generating public/private rsa key pair. Enter file ...

  2. ExtJS的4.1新特性简要介绍

    ExtJS的4.1新特性简要介绍 一.动态加载机制 Ext.require动态加载任何类,并且会加载依赖类: 二.新类系统 •类定义:ExtJS4.0以后应入了Ext.define方法,他通过类的字符 ...

  3. Chapter 1 First Sight——6

    "You didn't need to do that, Dad. I was going to buy myself a car." 你不需要这样,父亲,我会自己买一辆车的 &q ...

  4. html5中的postMessage解决跨域问题

    解决跨域问题的方法有很多,如:图像ping(简单).jsonp(缺点是不能实现跨域post).CROS(CORS的本质让服务器通过新增响应头Access-Control-Allow-Origin,通过 ...

  5. IFieldEdit Interface 接口

    Description The IFieldEdit interface is used when creating new fields. You should not use it to modi ...

  6. Ubuntu 12.04下安装thrift 0.9

    Thrift这里就不介绍了,只说一句--Facebook很牛逼. 我这里安装Thrift主要是为Accumulo数据库作准备,所以java语言为必选项. 具体安装参考官方Apache Thrift R ...

  7. 2016"百度之星" - 资格赛(Astar Round1) Problem A

    保存前缀乘,询问的时候输出c[ri]/c[li-1]即可,因为是除法,所以计算一下c[li-1]的逆元. #include <stdio.h> #include <math.h> ...

  8. Hibernate---第一个helloworld程序 (XML版本, annotation版本)

    Hibernate作为JPA的一种实现,jpa的注解已经是hibernate的核心,hibernate只提供了一些补充,而不是两套注解.hibernate对jpa的支持够足量,在使用hibernate ...

  9. 关于bool和BOOL的区别

    1.类型不同: BOOL是int类型,bool是布尔类型 2.长度不同: BOOL长度是其环境来定,一般是4个字节,因为其是int类型;bool长度为一个字节 3.取值不同: BOOL取值是FALSE ...

  10. 负载均衡 LVS+Keepalived

    系统  CentOS 5.6 X64 物理机 IP 10.10.10.104 Xen : 三台 CentOS 5.8 ip为: 10.10.10.106        10.10.10.107     ...