题目

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. git学习笔记 --分支管理策略

    通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息. 如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的comm ...

  2. maven的setting配置文件中mirror和repository的区别

    当maven需要到的依赖jar包不在本地仓库时, 就需要到远程仓库下载 . 这个时候如果mavensetting.xml中配置了镜像 , 而且镜像配置的规则中匹配到目标仓库时 , maven认为目标仓 ...

  3. IE浏览器 location.href 不跳转

    var url = "https://www.cnblogs.com/zing"; location.href = url; window.event.returnValue = ...

  4. Mars Sample 使用说明

    Mars Sample 使用说明  https://github.com/Tencent/mars/wiki/Mars-sample-%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98 ...

  5. SpringCloud中服务发现-Eureka

    1.Eureka服务端集群开发 1.先创建一个父工程 若是不是普通demo,还有别的配置时,需要注意若是服务开不起来可能就是父类依赖中可能会需要<dependencyManagement> ...

  6. 在Linux系统中创建SSH服务器别名

    如果你经常通过 SSH 访问许多不同的远程系统,这个技巧将为你节省一些时间.你可以通过 SSH 为频繁访问的系统创建 SSH 别名,这样你就不必记住所有不同的用户名.主机名.SSH 端口号和 IP 地 ...

  7. Matlab观察者模式

    要点: 1.服务端(Subject)维护一个观察者的列表,以便能够向所有的观察者(Observer)推送信息 2.观察者可以获取服务端的状态 3.服务端和观察者可抽象,可以有多个不同实现 Subjec ...

  8. node连接Mysql报错ER_NOT_SUPPORTED_AUTH_MODE

    报错信息 本人系统安装的是mysql-installer-community-8.0.18.0.msi这个版本,然后我本地使用node-mysql去连接数据库. test.js文件 var mysql ...

  9. JavaScript之轮播图

    (1)html <div class="box" id="box"> <ul class="uls" id="u ...

  10. 77.JS本地保存数据的几种方法

    1.Cookie 这个恐怕是最常见也是用得最多的技术了,也是比较古老的技术了.COOKIE优点很多,使用起来很方便 但它的缺点也很多: 比如跨域访问问题:无法保存太大的数据(最大仅为4KB):本地保存 ...