洛谷 P5506 封锁
题目
思路
模拟
\(\large\text{读题一定要细心}\)
解释都在代码里。
\(Code\)
#include<bits/stdc++.h>
#define MAXN 101
using namespace std;
int n,t;
struct qwq{
int dx,dy,dz;
}movebz[5][8];//用于存储f、h对应的正前方
struct info{
int x,y,z,h,f;
int atk,def,mat,mdf,hp,fix;
string cmd;
bool flag;
}a[MAXN];//存储每一架飞机的信息
inline int read(){
int x=0;bool f=0;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=!f;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return f?-x:x;
}//读优
inline void write(int x){
if(x<0){
putchar('-');
write(-x);
}else{
if(x/10) write(x/10);
putchar(x%10+'0');
}
}//输优
inline void move(){
for(int i=1;i<=n;++i){
if(!a[i].flag) continue;//注意:已经坠毁的飞机就不用移动了。
a[i].x+=movebz[a[i].h][a[i].f].dx;
a[i].y+=movebz[a[i].h][a[i].f].dy;
a[i].z+=movebz[a[i].h][a[i].f].dz;
}
}//向正前方移动
void work(){//打表,存储f、h对应的正前方
for(int i=0;i<=7;++i){
movebz[0][i].dx=0;movebz[0][i].dy=0;movebz[0][i].dz=-1;
movebz[4][i].dx=0;movebz[4][i].dy=0;movebz[4][i].dz=1;
}
movebz[1][0].dx=1;movebz[1][0].dy=0;movebz[1][0].dz=-1;
movebz[1][1].dx=1;movebz[1][1].dy=1;movebz[1][1].dz=-1;
movebz[1][2].dx=0;movebz[1][2].dy=1;movebz[1][2].dz=-1;
movebz[1][3].dx=-1;movebz[1][3].dy=1;movebz[1][3].dz=-1;
movebz[1][4].dx=-1;movebz[1][4].dy=0;movebz[1][4].dz=-1;
movebz[1][5].dx=-1;movebz[1][5].dy=-1;movebz[1][5].dz=-1;
movebz[1][6].dx=0;movebz[1][6].dy=-1;movebz[1][6].dz=-1;
movebz[1][7].dx=1;movebz[1][7].dy=-1;movebz[1][7].dz=-1;
movebz[3][0].dx=1;movebz[3][0].dy=0;movebz[3][0].dz=1;
movebz[3][1].dx=1;movebz[3][1].dy=1;movebz[3][1].dz=1;
movebz[3][2].dx=0;movebz[3][2].dy=1;movebz[3][2].dz=1;
movebz[3][3].dx=-1;movebz[3][3].dy=1;movebz[3][3].dz=1;
movebz[3][4].dx=-1;movebz[3][4].dy=0;movebz[3][4].dz=1;
movebz[3][5].dx=-1;movebz[3][5].dy=-1;movebz[3][5].dz=1;
movebz[3][6].dx=0;movebz[3][6].dy=-1;movebz[3][6].dz=1;
movebz[3][7].dx=1;movebz[3][7].dy=-1;movebz[3][7].dz=1;
movebz[2][0].dx=1;movebz[2][0].dy=0;movebz[2][0].dz=0;
movebz[2][1].dx=1;movebz[2][1].dy=1;movebz[2][1].dz=0;
movebz[2][2].dx=0;movebz[2][2].dy=1;movebz[2][2].dz=0;
movebz[2][3].dx=-1;movebz[2][3].dy=1;movebz[2][3].dz=0;
movebz[2][4].dx=-1;movebz[2][4].dy=0;movebz[2][4].dz=0;
movebz[2][5].dx=-1;movebz[2][5].dy=-1;movebz[2][5].dz=0;
movebz[2][6].dx=0;movebz[2][6].dy=-1;movebz[2][6].dz=0;
movebz[2][7].dx=1;movebz[2][7].dy=-1;movebz[2][7].dz=0;
}
int main(){
work();//预处理movebz数组
n=read(),t=read();
string s;
for(register int i=1;i<=n;++i){
a[i].x=read(),a[i].y=read();
a[i].z=read(),a[i].h=read();
a[i].f=read(),a[i].atk=read();
a[i].def=read(),a[i].mat=read();
a[i].mdf=read(),a[i].hp=read();
a[i].fix=read(),a[i].flag=1;
cin>>a[i].cmd;
}//读入好多好恶心~
for(int i=0;i<t;++i){
move();//每一次都要移动注意题目中的`先`
for(int j=1;j<=n;++j){
if(!a[j].flag||a[j].cmd[i]=='N') continue;//如果已经坠毁或这次无操作就continue
if(a[j].cmd[i]=='U'&&a[j].h<4) a[j].h++;//向上
if(a[j].cmd[i]=='D'&&a[j].h>0) a[j].h--;//向下
if(a[j].cmd[i]=='L'){//向左
if(a[j].f<7) a[j].f++;
else a[j].f=0;//认真读题,当f为7时如果在向左就会变为0
}
if(a[j].cmd[i]=='R'){
if(a[j].f>0) a[j].f--;//认真读题
else a[j].f=7;
}
if(a[j].cmd[i]=='F') a[j].hp+=a[j].fix;//修理
if(a[j].cmd[i]=='A'){//子弹
int sum=0;//判断向前移动了几次。
bool f=0;//判断有没有打到一架飞机
int xx=a[j].x,yy=a[j].y,zz=a[j].z;
there: xx+=movebz[a[j].h][a[j].f].dx;//每次向前移动
yy+=movebz[a[j].h][a[j].f].dy;
zz+=movebz[a[j].h][a[j].f].dz;
sum++;//移动次数加一
for(int k=1;k<=n;++k){
if(!a[k].flag) continue;//如果当前这架飞机坠毁了,就continue
if(a[k].x==xx&&a[k].y==yy&&a[k].z==zz){//如果当前到达了一架没有坠毁的飞机
f=1//打到了,qwq;
int sh=a[j].atk-a[k].def;//计算伤害
if(sh>0){//抠除血量
a[k].hp-=sh;
if(a[k].hp<=0){//因为坠毁的飞机最后输出时血量为0直接改成0
a[k].hp=0;
a[k].flag=0;//它坠毁了
}
}
break;//跳出循坏
}
if(sum>=400) f=1;//如果进行了8次以上的操作就直接跳出(这是卡测试数据,当时是IOI赛制的比赛)
}
if(!f) goto there;//如果还没有打到就再移动
}
if(a[j].cmd[i]=='M'){//激光和子弹类似qwq
int sum=0;//同上
int xx=a[j].x,yy=a[j].y,zz=a[j].z;
there2: xx+=movebz[a[j].h][a[j].f].dx;//同上
yy+=movebz[a[j].h][a[j].f].dy;
zz+=movebz[a[j].h][a[j].f].dz;
sum++;//同上
for(register int k=1;k<=n;++k){
if(!a[k].flag) continue;//同上
if(a[k].x==xx&&a[k].y==yy&&a[k].z==zz){
int sh=a[j].mat-a[k].mdf;//同上
if(sh>0){//同上
a[k].hp-=sh;
if(a[k].hp<=0){
a[k].flag=0;
a[k].hp=0;
}
}
}
if(sum>=400) break;//因为激光是打一行所以不管打没打到继续
}
if(sum<400) goto there2;
}
}
}
for(register int i=1;i<=n;++i){//输出答案qwq
write(a[i].x);printf(" ");
write(a[i].y);printf(" ");
write(a[i].z);printf(" ");
write(a[i].hp);
puts("");
}
return 0;
}
洛谷 P5506 封锁的更多相关文章
- 洛谷P5506 封锁
题目 一道模拟题,问题不是很大,主要需要读题清晰,且算法的操作顺序要搞明白,比如在每一秒的开始,所有无人机先移动,然后再一步一步操作. 然后就是判断方向是否一致了,细节还是很多的. #include ...
- 洛谷P1330封锁阳光大学[二分图染色]
题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...
- 洛谷P1330 封锁阳光大学
题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...
- 洛谷 P1330 封锁阳光大学 Label:染色问题
题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...
- 洛谷——P1330 封锁阳光大学
P1330 封锁阳光大学 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构 ...
- 洛谷P1330 封锁阳光大学 [图论,染色]
题目传送门 封锁阳光大学 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构 ...
- 洛谷 P1330 封锁阳光大学
题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...
- 洛谷P1330 封锁阳光大学(二分图染色)
P1330 封锁阳光大学 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构 ...
- 洛谷 P1330 封锁阳光大学题解
题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...
随机推荐
- 怎样遍历NodeList对象
因为NodeList对象是一个类似数组的对象, 且它自带了一个 forEach() 方法, 因此可以使用 forEach() 遍历, 它的用法和 Array 里面的 forEach() 是完全一样的. ...
- Ambari调整日志级别:How to enable debug logging in Ambari Server and Ambari Agent ?
PURPOSE When troubleshooting Ambari issues, it may be necessary to enable debug logging in the Ambar ...
- java之spring之整合ssh-2
这篇也是主要讲解 ssh 的整合,不同于上一篇的是它的注入方式. 这篇会采用扫描注入的方式,即去除 applicationContext-asd.xml 文件. 目录结构如下: 注意,这里只列举不同的 ...
- Ole操作帮助类
/// <summary> /// Ole操作类 /// </summary> public class OleDataBaseHandle { private static ...
- np.minimum()与tf.minimum()的用法
总结:二者用法一致.a=np.array([[[[10,8,3,9],[5,6,7,8]]],[[[1,2,3,4],[5,6,7,8]]],[[[1,2,3,4],[5,6,7,8]]]] )pri ...
- 2019 网宿科技java面试笔试题 (含面试题解析)
本人3年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.网宿科技等公司offer,岗位是Java后端开发,最终选择去了网宿科技. 面试了很多家公司,感觉大部分公司考察的点 ...
- Java自学-控制流程 break
Java的break语句 结束循环 示例 1 : break; 直接结束当前for循环 public class HelloWorld { public static void main(String ...
- MySQL中的JSON类型
前言(废话) 昨天抽了点时间在网上搜列了一个开源项目,项目挺完整的,前后台分离还带有微信小程序,我Clone下代码,经过一番倒腾,嘿~还真就跑起来了.在这个过程中,体验了一把VUE项目工程细节,因为之 ...
- php xml解析
XML处理是开发过程中经常遇到的,PHP对其也有很丰富的支持,本文只是对其中某几种解析技术做简要说明,包括:Xml parser, SimpleXML, XMLReader, DOMDocument. ...
- JAVA导出excel 直接弹出下载框
转自:https://blog.csdn.net/qq_38423105/article/details/80782283 效果展示: 1.首先准备jar包 <dependency> ...