题目

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 封锁的更多相关文章

  1. 洛谷P5506 封锁

    题目 一道模拟题,问题不是很大,主要需要读题清晰,且算法的操作顺序要搞明白,比如在每一秒的开始,所有无人机先移动,然后再一步一步操作. 然后就是判断方向是否一致了,细节还是很多的. #include ...

  2. 洛谷P1330封锁阳光大学[二分图染色]

    题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...

  3. 洛谷P1330 封锁阳光大学

    题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...

  4. 洛谷 P1330 封锁阳光大学 Label:染色问题

    题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...

  5. 洛谷——P1330 封锁阳光大学

    P1330 封锁阳光大学 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构 ...

  6. 洛谷P1330 封锁阳光大学 [图论,染色]

    题目传送门 封锁阳光大学 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构 ...

  7. 洛谷 P1330 封锁阳光大学

    题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...

  8. 洛谷P1330 封锁阳光大学(二分图染色)

    P1330 封锁阳光大学 题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构 ...

  9. 洛谷 P1330 封锁阳光大学题解

    题目描述 曹是一只爱刷街的老曹,暑假期间,他每天都欢快地在阳光大学的校园里刷街.河蟹看到欢快的曹,感到不爽.河蟹决定封锁阳光大学,不让曹刷街. 阳光大学的校园是一张由N个点构成的无向图,N个点之间由M ...

随机推荐

  1. C# 截取字符串方法总结

    第一种:根据单个分隔字符用split截取 string st="GT123_1"; string[] sArray=st.split("_"); //即可得到s ...

  2. requirejs:模块加载(require)及定义(define)时的路径理解

    给新来的实习生普及下JS基本知识,看到比较好的文章 转载https://blog.csdn.net/xuxiaoping1989/article/details/52384778 接触过require ...

  3. 【面试突击】-Redis常见面试题(二)

    1.什么是Redis?简述它的优缺点? Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到 ...

  4. 想知道使用OPC服务器时如何设置DCOM?看完本文就懂了(下)

    接上文...... “安全”选项卡“安全”选项卡上,有3个选项需要设置. 启动权限 选择“使用默认值”选项 访问权限 选择“使用默认值”选项 配置权限 选择“自定义”选项,然后单击“编辑” 将打开一个 ...

  5. 木马防杀 花指令 OllyDbg

    打开木马 入口地址 添加花指令 全0的地方,可以插入花指令 保存为可执行文件 随便选择几行,右击 保存文件

  6. Nginx 反向代理Tomcat服务器获取真实IP问题

    1.nginx.conf 配置 修改 Server location配置 增加 proxy_set_header X-Real-IP $remote_addr; #保留代理之前的真实客户端ip pro ...

  7. 【BBED】bbed常用命令

    [BBED]bbed常用命令         一.1  相关知识点扫盲 BBED(Oracle Block Browerand EDitor Tool),用来直接查看和修改数据文件数据的一个工具,是O ...

  8. 数据分析之sklearn

    一,介绍 Python 中的机器学习库 简单高效的数据挖掘和数据分析工具 可供大家使用,可在各种环境中重复使用 建立在 NumPy,SciPy 和 matplotlib 上 开放源码,可商业使用 - ...

  9. linux虚拟串口及远程访问

    1. 虚拟终端概念 linux中有很多终端,如下简单介绍下各种终端或串口的概念. 1.1 tty:终端设备的统称 tty是Teletype或TeletypeWriter的缩写,中文翻译为电传打字机.电 ...

  10. Gtest:Using visual studio 2017 cross platform feature to compile code remotely

    参考:使用Visual Studio 2017作为Linux C++开发工具 前言 最近在学Gtest单元测试框架,由于平时都是使用Source Insight写代码,遇到问题自己还是要到Linux下 ...