洛谷 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 ...
随机推荐
- Scala 系列(一)—— Scala 简介及开发环境配置
一.Scala简介 1.1 概念 Scala 全称为 Scalable Language,即"可伸缩的语言",之所以这样命名,是因为它的设计目标是希望伴随着用户的需求一起成长.Sc ...
- nginx+lua+storm的热点缓存的流量分发策略自动降级
1.在storm中,实时的计算出瞬间出现的热点. 某个storm task,上面算出了1万个商品的访问次数,LRUMap 频率高一些,每隔5秒,去遍历一次LRUMap,将其中的访问次数进行排序,统计出 ...
- C# vb .net实现焦距灰度特效滤镜
在.net中,如何简单快捷地实现Photoshop滤镜组中的焦距灰度效果呢?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码: 设置授权 第 ...
- C#录制屏幕采集系统桌面画面
在项目中,有很多需要录制屏幕的场景,比如直播课,录制教学视频等场景.但.NET自带的Screen类功能比较弱,效率很低.那么如何简单快捷地高效采集桌面屏幕呢?当然是采用SharpCapture!下面开 ...
- 读取txt文件的数据,并将其转换为矩阵
import numpy as nppath_txt_data = 'C:/Users/51102/Desktop/my_yolo/data/box/train.txt'def input_data( ...
- 数据仓库模型ETL架构(DWI/DWR/DM)
1.DWI DWI:数据湖.数据砥柱,一般存放在HDFS 数据仓库的基础数据来源,各种杂七杂八的数据 关键点:数据清洗.数据整合.异常处理.增量获取 ETL:E-数据抽取.数据清洁.格式转换,T-生成 ...
- list集合排序案例
// List集合排序: Collections.sort(list, new Comparator<Object>(){ public int compare(Object obja, ...
- 移动端初始化常用JavaScript代码
移动端常用js分享 1.把手机屏幕等分10分(我用的是这种形式),用rem来计算那些需要自适应. <script type="text/javascript"> (fu ...
- 基于CentOS7配置ArcGIS enterprise
Centos7GUI安装过程 1.右键点击列表中的虚拟主机,打开控制台. 点击绿色开机键,开始安装. 这里有一个很关键的点,就是上一步设置中的打开电源自动连接.一开始设置的时候别忘了. 2.开机后会出 ...
- MSP430 LaunchPad开发板入门教程集合
MSP-EXP430G2开发板是德州仪器提供的开发工具,也称为LaunchPad,用于学习和练习如何使用其微控制器产品.该开发板属于MSP430 Value Line系列,我们可以对所有MSP430系 ...