洛谷 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 ...
随机推荐
- .NET 的程序集加载上下文
原文:.NET 的程序集加载上下文 我们编写的 .NET 应用程序会使用到各种各样的依赖库.我们都知道 CLR 会在一些路径下帮助我们程序找到依赖,但如果我们需要手动控制程序集加载路径的话,需要了解程 ...
- .NET Core微服务学习-DotNetty
DotNetty介绍: DotNetty是Azure团队仿照(几乎可以这么说)JAVA的Netty而出来的(目前已实现Netty的一部分),目前在Github上的Star有1.8K+, 地址:http ...
- vim打开多个文件、同时显示多个文件、在文件之间切换
打开多个文件: 1.vim还没有启动的时候: 在终端里输入 vim file1 file2 ... filen便可以打开所有想要打开的文件 2.vim已经启动 输入 :open file 可以再打开 ...
- 如何理解Android中的xmlns
转发自:https://www.jianshu.com/p/6fcaffaeffd2 作为一名 Android 开发,我想大家对xmlns并不会陌生,因为在写布局文件(如下代码所示)的时候经常会碰到, ...
- vue动态加载不同的组件(分内部和外部组件)
<!DOCTYPE html> <html> <head> <title> hello world vue </title> <met ...
- 一个工作13年的SAP开发人员的回忆:电子科技大学2000级新生入学指南
让我们跟着Jerry的文章,一起回到本世纪初那个单纯美好的年代. 2000年9月,Jerry告别了自己的高中时代,进入到自己心目中的电子游戏大学,开始了四年的本科生活.每个新生,都拿到了这样一本薄薄的 ...
- 深入理解JVM-java虚拟机栈
1.java虚拟机栈 1. Java虚拟机栈也是线程私有的,它的生命周期与线程相同(随线程而生,随线程而灭) 2. 如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowErro ...
- MySQL DataType--浮点数(Floating-Point Types)学习
浮点数(Floating-Point Types) MySQL支持两种浮点数类型来表示近似值:1.FLOAT,单精度浮点数,使用4字节存储,存储数据范围3.402823466E+38 - -1.175 ...
- 10 分钟上手 Vue 组件 Vue-Draggable
Vue 综合了 Angualr 和 React 的优点,因其易上手,轻量级,受到了广泛应用.成为了是时下火热的前端框架,吸引着越来越多的前端开发者! 本文将通过一个最简单的拖拽例子带领大家快速上手 V ...
- 二、Linux_系统信息查看
系统信息查看 1. Linux查看cpu核数等信息: [root@tdh01 ~]# grep 'physical id' /proc/cpuinfo | sort -u # 查看物理cpu个数 ph ...