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. 09_springmvc图片上传

    一.上传图片 1.需求 在修改商品页面,添加上传商品图片的功能 2.springmvc中对多部件类型解析 在页面form中提交enctype="multipart/form-data&quo ...

  2. js new运算符

    用代码模拟这个逻辑就是

  3. 【颓废篇】easyx--2048

    整天待在机房是不是,一直保持学术的态度就比较的难啊~ 所以本蒟蒻就在学术之余学了些奇技淫巧,然后就写了一些奇奇怪怪的程序啊,比如让我们小组dalao们都颓得不亦乐乎的2048~~ 当然,2048的实现 ...

  4. 莫烦PyTorch学习笔记(六)——批处理

    1.要点 Torch 中提供了一种帮你整理你的数据结构的好东西, 叫做 DataLoader, 我们能用它来包装自己的数据, 进行批训练. 而且批训练可以有很多种途径. 2.DataLoader Da ...

  5. React报错:Laravel React-Router browserHistory 刷新子页面报错404

    举例:myblog.com/ 刷新没问题 myblog.com/add 刷新404 browserHistory报404,hashHistory却正常 原因是少路由.web.php添加路由 Route ...

  6. Java常用英语汇总(面试必备)

    Java常用英语汇总(面试必备) abstract (关键字)             抽象 ['.bstr.kt] access                            vt.访问,存 ...

  7. Windows操作系统下创建进程的过程

    进程(Process)是具有一定独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的一个独立单位.程序只是一组指令的有序集合,它本身没有任何运行的含义,只是一个静态实体.而进程则 ...

  8. OpenCASCADE 7.4.0 Released

    Open Cascade is pleased to announce a new public release of Open CASCADE Technology (version 7.4.0). ...

  9. PHP面向对象访问修饰符的基本了解

    l 文档的介绍: 对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的.被定义为公有的类成员可以在任何地方被访问.被定义 ...

  10. Data too long for column

    一篇文章的正文,需要很多字数,默认就是255,不够 @Lob @Basic @Type(type = "text") @Column(name = "detail&quo ...