【算法】Escape
The red army and the blue army are at war today. The blue army
finds that Little A is the spy of the red army, so Little A has to
escape from the headquarters of the blue army to that of the red army.
The battle field is a rectangle of size m*n, and the headquarters of the
blue army and the red army are placed at (0, 0) and (m, n),
respectively, which means that Little A will go from (0, 0) to (m, n).
The picture below denotes the shape of the battle field and the notation
of directions that we will use later.
The blue army is eager to revenge, so it tries its best to kill
Little A during his escape. The blue army places many castles, which
will shoot to a fixed direction periodically. It costs Little A one unit
of energy per second, whether he moves or not. If he uses up all his
energy or gets shot at sometime, then he fails. Little A can move north,
south, east or west, one unit per second. Note he may stay at times in
order not to be shot.
To simplify the problem, let’s assume that Little A cannot stop in
the middle of a second. He will neither get shot nor block the bullet
during his move, which means that a bullet can only kill Little A at
positions with integer coordinates. Consider the example below. The
bullet moves from (0, 3) to (0, 0) at the speed of 3 units per second,
and Little A moves from (0, 0) to (0, 1) at the speed of 1 unit per
second. Then Little A is not killed. But if the bullet moves 2 units per
second in the above example, Little A will be killed at (0, 1).
Now, please tell Little A whether he can escape.
four integers, m, n, k and d (2<=m, n<=100, 0<=k<=100, m+
n<=d<=1000). m and n are the size of the battle ground, k is the
number of castles and d is the units of energy Little A initially has.
The next k lines describe the castles each. Each line contains a
character c and four integers, t, v, x and y. Here c is ‘N’, ‘S’, ‘E’ or
‘W’ giving the direction to which the castle shoots, t is the period, v
is the velocity of the bullets shot (i.e. units passed per second), and
(x, y) is the location of the castle. Here we suppose that if a castle
is shot by other castles, it will block others’ shots but will NOT be
destroyed. And two bullets will pass each other without affecting their
directions and velocities.
All castles begin to shoot when Little A starts to escape.
Proceed to the end of file.
OutputIf Little A can escape, print the minimum time required in seconds on a single line. Otherwise print “Bad luck!” without quotes.

#include<stdio.h>
#include<iostream>
#include<queue>
#include<string.h>
using namespace std; struct man{
short x,y,t;
}; int n,m,k,energy;
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
bool tmap[101][101][1001];//前两维代表坐标,后一维表时时间:意为每个位置的每个时刻有没子弹和碉堡(这里一定要用bool,用int会超内存)
bool vist[101][101][1001];//第几个时刻的位置走过否 int OK(int x,int y,int time)//返回1说明位位置的当前时间可以走,加入队列
{
if(x>=0&&x<=n&&y>=0&&y<=m&&!tmap[x][y][time]&&n-x+m-y<=energy-time&&!vist[x][y][time])
{
vist[x][y][time]=true; return 1;
}
return 0;
}
void bfs()
{
queue<man>qMan;
man pMan,tpMan;
int time=0,x,y; pMan.x=0; pMan.y=0; pMan.t=0;
if(OK(pMan.x,pMan.y,time))
qMan.push(pMan); while(true)
{
time++;
if(qMan.empty()||time>energy)
{
printf("Bad luck!\n"); return ;
}
while(!qMan.empty())
{
pMan=qMan.front();
if(pMan.t>=time)
break;
qMan.pop();
pMan.t=time;
if(OK(pMan.x,pMan.y,time))//可以停在原地
qMan.push(pMan);
for(int e=0;e<4;e++)
{
tpMan=pMan;
tpMan.x+=dir[e][0]; tpMan.y+=dir[e][1];
if(OK(tpMan.x,tpMan.y,time))
{
if(tpMan.x==n&&tpMan.y==m)
{
printf("%d\n",time); return ;
}
qMan.push(tpMan);
}
}
}
}
}
int main()
{
char ss[3];
int map[105][105];
int tx,ty,x[105],y[105],T[105],v[105],d[105];
while(scanf("%d%d%d%d",&n,&m,&k,&energy)>0)
{
for(int i=0;i<=n;i++)
for(int j=0;j<=m;j++)
for(int t=0;t<=energy;t++)
tmap[i][j][t]=vist[i][j][t]=false;
memset(map,0,sizeof(map)); for(int i=0;i<k; i++)
{
scanf("%s%d%d%d%d",ss,&T[i],&v[i],&x[i],&y[i]);
if(ss[0]=='N') d[i]=0;
else if(ss[0]=='S') d[i]=1;
else if(ss[0]=='W') d[i]=2;
else if(ss[0]=='E') d[i]=3;
map[x[i]][y[i]]=1;//碉堡位置
}
//计算每个时刻子弹和碉堡在地图的位置
for(int i=0;i<k; i++)
{
for(int t=1;t<=energy; t++)//一开始当前碉堡发出的子弹的每个时间运行
{
tmap[x[i]][y[i]][t]=true;//每个刻碉堡的位置
//第i个碉堡一开始发的子弹运行了t时到达的位置
tx=x[i]+dir[d[i]][0]*v[i]*t;
ty=y[i]+dir[d[i]][1]*v[i]*t; if(tx>=0&&tx<=n&&ty>=0&&ty<=m)//是否越界
for(int tt=t; tt<=energy; tt+=T[i])//第i个碉堡发出的子弹周期性的到达同一位置
if(!tmap[tx][ty][tt])
{
//判断从第i个碉堡位置发出的子弹能否到达位置(tx,ty)
int flag=0,xx=x[i],yy=y[i];
if(d[i]==0)
{
for( xx=x[i]-1; xx>=tx; xx--)
if(map[xx][yy])
break;
if(xx<tx) flag=1;
}
else if(d[i]==1)
{
for( xx=x[i]+1; xx<=tx; xx++)
if(map[xx][yy])
break;
if(xx>tx) flag=1;
}
else if(d[i]==2)
{
for(yy=y[i]-1; yy>=ty; yy--)
if(map[xx][yy])
break;
if(yy<ty) flag=1;
}
else
{
for(yy=y[i]+1; yy<=ty; yy++)
if(map[xx][yy])
break;
if(yy>ty) flag=1;
} if(flag)//能到达,说明路过的地没有其他碉堡阻挡
tmap[tx][ty][tt]=true;
}
}
}
bfs();
}
}
【算法】Escape的更多相关文章
- 【算法系列学习】[kuangbin带你飞]专题二 搜索进阶 D - Escape (BFS)
Escape 参考:http://blog.csdn.net/libin56842/article/details/41909459 [题意]: 一个人从(0,0)跑到(n,m),只有k点能量,一秒消 ...
- HDU3533 Escape —— BFS / A*算法 + 预处理
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3533 Escape Time Limit: 20000/10000 MS (Java/Others) ...
- hdu 3605 Escape 二分图的多重匹配(匈牙利算法)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3605 Escape Time Limit: 4000/2000 MS (Java/Others) ...
- CYQ.Data V5 分布式缓存Redis应用开发及实现算法原理介绍
前言: 自从CYQ.Data框架出了数据库读写分离.分布式缓存MemCache.自动缓存等大功能之后,就进入了频繁的细节打磨优化阶段. 从以下的更新列表就可以看出来了,3个月更新了100条次功能: 3 ...
- [ACM训练] 算法初级 之 搜索算法 之 深度优先算法DFS (POJ 2251+2488+3083+3009+1321)
对于深度优先算法,第一个直观的想法是只要是要求输出最短情况的详细步骤的题目基本上都要使用深度优先来解决.比较常见的题目类型比如寻路等,可以结合相关的经典算法进行分析. 常用步骤: 第一道题目:Dung ...
- Memcache技术分享:介绍、使用、存储、算法、优化、命中率
1.memcached 介绍 1.1 memcached 是什么? memcached 是以LiveJournal旗下Danga Interactive 公司的Brad Fitzpatric 为首开发 ...
- 面试题(C#算法编程题)
1>用C#写一段选择排序算法,要求用自己的编程风格.答:private int min; public void xuanZhe(int[] list)//选择排序 { ...
- C#常见算法题目(面试准备)
1.写出冒泡,选择,插入排序算法. //冒泡排序 public class bubblesorter { public void sort(int[] list) ...
- 物体检测算法 SSD 的训练和测试
物体检测算法 SSD 的训练和测试 GitHub:https://github.com/stoneyang/caffe_ssd Paper: https://arxiv.org/abs/1512.02 ...
随机推荐
- STL:unordered_set/unordered_multiset(c++11)
unordered_set:容器内的元素无序排列,基于值进行获取单个元素速度非常快.内部根据它们的 hash value 被组织成 buckets(slot). unordered_multiset: ...
- poj1256(贪心+并查集)
题目链接:http://poj.org/problem?id=1456 题意:给n件商品的价格和卖出截至时间,每一个单位时间最多只能卖出一件商品,求能获得的最大利润. 思路:首先是贪心,为获得最大利润 ...
- APIView和View的区别
APIView和View的区别 API继承了View 重写了as_view方法 --豁免csrf def dispatch(self, request, *args, **kwargs): self. ...
- Dbutils 连接数据库
用了JDBC后接着学习Dbutils连接数据库 1.添加驱动包 Class.forName("oracle.jdbc.driver.OracleDriver"); 2.获取数据库连 ...
- Javascript 强制浏览器渲染Dom文档
在Cordova+Framework7开发Hybrid App时,在iPhone 7上遇到一个诡异的现象(Chrome浏览器.Android都正常):js修改手风琴中的input文本框的值后,但页面仍 ...
- CountDownLatch的和CyclicBarrier使用
CyclicBarrier的使用: 假设只有一个场景:每个线程代表一个跑步运动员,当运动员都准备好后,才一起出发,只要有一个人没有准备好,大家都等待. CountDownLacth使用: 他经常用于监 ...
- EXCEL中去掉撇号的操作方法
▲数字前带撇号 选定想去掉撇号的列,然后选“数据”→“分列”在弹出的 对话框中单击“下一步” ,在“文本标识符号”处选择“'” 单击 “完成”即可
- java 动手动脑解决问题
1.Java的基本运行单位是类还是方法?是类,因为没有方法可以独立存在,方法在逻辑上属于类或属于对象. 2.类的组成成员?成员变量,成员方法. 3.成员变量的种类? byte short int lo ...
- composer 安装新包失败的原因之一
各种方法都尝试过了,然而最大的可能就是不能访问国外的资源! 1.使用vpnFQ下载 2.修改一下composer的配置,命令如下: composer config -g repo.packagist ...
- centos7下的glusterfs的安装与使用
环境说明: 两台虚拟主机,IP分别为192.168.1.222和192.168.1.233,分别装上glusterfs. 一.下载glusterfs源码包 https://download.glust ...