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

Submit Status

Description

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

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

Input

输入的第一行包含三个整数:M,N,T。代表M行N列的地图和鸣人初始的查克拉数量T。0 < M,N < 200,0 ≤ T < 10 
后面是M行N列的地图,其中@代表鸣人,+代表佐助。*代表通路,#代表大蛇丸的手下。

Output

输出包含一个整数R,代表鸣人追上佐助最少需要花费的时间。如果鸣人无法追上佐助,则输出-1。

Sample Input

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

Sample Output

样例输出1
6
样例输出2
4

跟上一题一个意思……状态差不多……神奇的是这题居然没人做……A*比普通BFS慢……估计是数据太小和我估价函数选的搓的缘故。1A水

代码:

#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<sstream>
#include<cstring>
#include<cstdio>
#include<string>
#include<deque>
#include<stack>
#include<cmath>
#include<queue>
#include<set>
#include<map>
using namespace std;
#define INF 0x3f3f3f3f
#define MM(x,y) memset(x,y,sizeof(x))
typedef pair<int,int> pii;
typedef long long LL;
const double PI=acos(-1.0);
const int N=205;
struct info
{int x;int y;int zkl;int step;int h;bool operator<(const info &b)const{if(step+h!=b.step+b.h)return step+h>b.step+b.h;if(step!=b.step)return step>b.step;if(zkl!=b.zkl)return zkl>b.zkl;}
};
info S,T,direct[4]={{0,1,1,0},{0,-1,1,0},{1,0,1,0},{-1,0,1,0}};
inline info operator+(const info &a,const info &b)
{info c;c.x=a.x+b.x;c.y=a.y+b.y;c.step=a.step+b.step;return c;
}
inline bool operator==(const info &a,const info &b)
{return (a.x==b.x&&a.y==b.y);
}
int n,m,t;
char pos[N][N];
int vis[N][N][10];
priority_queue<info>Q;
void init()
{MM(pos,0);MM(vis,0);while (!Q.empty())Q.pop();
}
bool check(const info &a)
{return (a.x>=0&&a.x<m&&a.y>=0&&a.y<n&&a.zkl<=t&&!vis[a.x][a.y][a.zkl]);
}
inline int ABS(const int &n)
{return n<0?-n:n;
}
int main(void)
{int i,j,r;while (~scanf("%d%d%d",&m,&n,&t)){r=-1;init();for (i=0; i<m; i++){scanf("%s",pos[i]);for (j=0; j<n; j++){if(pos[i][j]=='@'){S.x=i;S.y=j;S.step=0;S.zkl=0;}else if(pos[i][j]=='+'){T.x=i;T.y=j;}}}S.h=S.step+ABS(S.x-T.x)+ABS(S.y-T.y);Q.push(S);vis[S.x][S.y][S.zkl]=1;while (!Q.empty()){info now=Q.top();Q.pop();if(now==T){r=now.step;break;}for (i=0; i<4; i++){info v=now+direct[i];v.zkl=now.zkl+(pos[v.x][v.y]=='#');if(check(v)){v.step=now.step+1;v.h=v.step+ABS(v.x-T.x)+ABS(v.y-T.y);Q.push(v);vis[v.x][v.y][v.zkl]=1;}}}printf("%d\n",r);}return 0;
}

转载于:https://www.cnblogs.com/Blackops/p/5766294.html

OpenJ_Bailian——4115鸣人和佐助(带状态的A*)相关推荐

  1. 百练4115 鸣人和佐助(变式BFS)

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

  2. 6044:4115:鸣人和佐助

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

  3. 算法基础:4115:鸣人和佐助--广度优先搜索

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

  4. Bailian4115 鸣人和佐助【BFS】

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

  5. 第9周测验-鸣人和佐助

    021:鸣人和佐助 1. 题目详情 描述 输入 输出 样例输入 样例输出 2.思路分析 2.1 整体思路 2.2 限制条件处理 2.3 剪枝 3.注意点 4.AC代码 5.总结 1. 题目详情 描述 ...

  6. O - 鸣人和佐助(BFS)

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

  7. OpenJudge-021:鸣人和佐助

    OpenJudge-021:鸣人和佐助 题目描述: 题目传送门:添加链接描述 已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置.地图上的每个位置都可以走到,只不过有些位置上有大蛇丸的手下,需要 ...

  8. T1214 鸣人和佐助——dfs、bfs

    佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢? 分析 bfs 迷宫问题,求最短时间,和 拯救行动 差不多,存在打怪兽可以通过的另外条件:但是此题打怪兽不需要另耗时间,所以第一次找到的终点就是最短时 ...

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

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

最新文章

  1. spss数据预处理步骤_数学建模准备必备的十个数据分析软件(数学建模从入门到精通)...
  2. RabbitMQ——无法连接错误[AmqpConnectException: java.net.ConnectException: Connection refused: connect]解决方案
  3. 一步一步教你抓数据——用.net精确提取网站数据的通用方法 [转]
  4. JDK 9中不推荐使用Java的Observer和Observable
  5. python中判断字符串的常用操作
  6. 快速建站-html基础-0223
  7. 计算机技能大赛图形试题,图形图像处理技能大赛竞赛试题试卷.doc
  8. TF-卷积函数 tf.nn.conv2d 介绍
  9. 面向对象的三个基本特征(讲解)-转载
  10. C++ 常用的八种排序方法
  11. java.lang.IllegalStateException: No instances available for user
  12. 上海市犬伤处置门诊目录(上海哪些医院可以打狂犬疫苗)
  13. CVE-2018-6794一把梭
  14. 【Unity3D】协同程序
  15. 计算机键盘上的基准键是哪两个键,键盘上的基准键分别是什么?
  16. 电脑中常用的“扇区”、“簇”、“块”、“页”等概念
  17. 百兆以太网PHY芯片,RPC8201F,瑞普康,替代瑞昱RTL8201
  18. Oracle:2、SQL基础
  19. Java、C++、Python、Ruby、PHP、C#和JavaScript的理解
  20. 082-天气预报之城市代码 ID

热门文章

  1. 利用Java的BigDecimal与马青公式精确计算π后10000位,
  2. oracle的md5加密
  3. springboot的redis工具类编写(采用RedisTemplate)(简单的取值,取多个值)。
  4. Linux下远程桌面连接windows
  5. html导航条置顶,jquery导航菜单栏固定悬浮顶部实现效果
  6. Visual Studio 2017 、2019安装Windows SDK失败的解决办法(改盘符引起)
  7. 关于优酷开放SDk之setOnAdCountListener和setOnNetworkSppedListener
  8. Linux采用存储管理方式,19.Linux采用( A )存储管理方式。
  9. android viewpager动态加载图片,Android使用ViewPager加载图片和轮播视频
  10. spring配置JDBC事务