6044:鸣人和佐助

总时间限制: 
1000ms

内存限制: 
65536kB
描述

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

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

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


解题思路:
迷宫内求最少的时间,很明显的bfs或dp题型。数据量并不大。本蒟蒻本想在同学面前秀一下状压dp,结果仔细一看……老实用bfs吧。
这里比普通的二维迷宫加了一个时间,在不同的时间走到同一个格点,是不同的情况,扩展出来的新元素也会不同。所以我们需要在
标记数组中加一维用于记录时间。
如果你不用queue的话,最好自己写一个函数来模拟,尤其是这种用到结构体的bfs。否则会代码很凌乱。
注意一下p和t加1减1之类的,我这个代码应该不需要考虑了。
蒟蒻一只,有错误之处还请谅解。欢迎提问-.-

代码如下:


#include<cstdio>
#include<queue>
using namespace std;
char g[205][205];
int dic[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
int sx,sy,ex,ey;
int tmax,pmin;
int m,n;
bool b[205][205][15];
const int Inf=999999;
struct squ
{
int x,y,p,t;
squ(int xa,int ya,int pa,int ta):x(xa),y(ya),p(pa),t(ta){};//构造函数的一种类型:初始化列表。所以oop还是要学的
};
queue<squ> q;
void bfs()
{
//初始化
int t=0,p=0,nx=0,ny=0;
	squ temp(sx,sy,0,tmax);
q.push(temp);
while(!q.empty())
{
//获取队首元素后弹出
temp=q.front();
t=temp.t;
p=temp.p;
if(temp.x==ex && temp.y==ey)
{
pmin=temp.p;
return;
}
q.pop();
//四方向枚举
for(int i=0;i<4;i++)
{
nx=temp.x+dic[i][0];
ny=temp.y+dic[i][1];
			if(!b[nx][ny][t] && nx>0 && nx<=m && ny>0 && ny<=n && g[nx][ny] != '#' )
{
q.push(squ(nx,ny,p+1,t));
b[nx][ny][t]=true;
}
//由于C++运算符的短路现象,在&&中,当t>0不符合时,!b[nx][ny][t-1]不会执行,不必担心越界问题。
if(t>0 && !b[nx][ny][t-1] && nx>0 && nx<=m && ny>0 && ny<=n && g[nx][ny] == '#')
{
q.push(squ(nx,ny,p+1,t-1));
b[nx][ny][t-1]=true;
}
}
}
}
int main()
{
freopen("data.txt","r",stdin);//良好的调试习惯
scanf("%d%d%d",&m,&n,&tmax);//尽量使用scanf和printf,这样更快。当然你要优化输入我。。。Orz
pmin = Inf;
getchar();
for(int i = 1;i <= m;i++)
{
for(int j = 1;j <= n;j++)
{
scanf("%c",&g[i][j]);
if(g[i][j] == '+')
{
ex = i;
ey = j;
}
else if(g[i][j] == '@')
{
sx = i;
sy = j;
}
}
getchar();
}
if(sx==ex && sy == ey)
{
printf("0");
return 0;
}
bfs();
if(pmin==Inf)
printf("-1");
else
printf("%d",pmin);
return 0;
}


[NOI OJ]6044:鸣人和佐助的更多相关文章

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

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

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

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

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

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

  4. noi openjudge 6044:鸣人和佐助

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

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

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

  6. BFS:noi6044鸣人与佐助

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

  7. 九度OJ 1013 开门人和关门人

    #include <iostream> #include <string.h> #include <sstream> #include <math.h> ...

  8. Algorithm Exercises

    汇总一些常见的算法题目,参考代码. 注:部分题目没有合适的oj地址 枚举 Perfect Cubes.Biorhythms.Counterfeit Dollar.EXTENDED LIGHTS OUT ...

  9. 初识Scrapy之再续火影情缘

    前言Scrapy框架之初窥门径1 Scrapy简介2 Scrapy安装3 Scrapy基础31 创建项目32 Shell分析4 Scrapy程序编写41 Spiders程序测试42 Items编写43 ...

随机推荐

  1. (转)Lua语言实现简单的多线程模型

    转自: https://blog.csdn.net/john_crash/article/details/49489609 lua本身是不支持真正的多线程的,但是lua提供了相应的机制来实现多线程.l ...

  2. 【学术篇】luogu2184贪婪大陆

    题目在这里哦, 戳一下就可以了~ 题目大意: 支持两种操作,区间添加一种新元素,查询区间颜色种数.. 题目标签是线段树啊,我也本来想写一个线段树,后来写不出来……(我太弱了orz) 然后就草率地看了看 ...

  3. 线性回归和梯度下降代码demo

    程序所用文件:https://files.cnblogs.com/files/henuliulei/%E5%9B%9E%E5%BD%92%E5%88%86%E7%B1%BB%E6%95%B0%E6%8 ...

  4. Windows中的Tree命令

    Windows中的Tree命令你会用吗? - 步行者的专栏 - CSDN博客 https://blog.csdn.net/hantiannan/article/details/7663893 (ven ...

  5. 左神算法书籍《程序员代码面试指南》——1_01设计一个有getMin功能的栈

    [题目] 实现一个特殊的栈,在实现栈的基本功能的基础上,再实现返回栈中最小元素的操作. [要求] 1.pop.push.getMin操作的时间复杂度都是O(1).2.设计的栈类型可以使用现成的栈结构. ...

  6. Spring-白话事物

    什么是事物,把一组逻辑放在一起作为一个单元来提交执行,这就是事物,这不是定义,大概是这么个意思 如果你留心的话,你会看到到处都有事物,到处都会提到ACID四个特性(原子性,一致性,隔离性,持久性) R ...

  7. java基础之Date类

    Date类: Date类概述 类 Date 表示特定的瞬间,精确到毫秒. 构造方法 public Date() public Date(long date) 成员方法 public long getT ...

  8. Swagger发布服务器时错误 500 : { "Message": "An error has occurred." }

    在做Web API的文档自动生成时,本机调试都正常,发布到服务器上出现500错误 500 : { "Message": "An error has occurred.&q ...

  9. 20-iframe

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. 解决Navicat 报错:1130-host is not allowed MySQL不允许从远程访问的方法

    ERROR 1130: Host '192.168.1.3' is not allowed to connect to thisMySQL server 解决方法: 1. 改表法.可能是你的帐号不允许 ...