设为首页 加入收藏

TOP

洛谷 P5506 封锁(一)
2019-08-15 00:03:44 】 浏览:114
Tags:洛谷 P5506 封锁

题目

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].
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇洛谷 P3884 [JLOI2009]二叉树问题 下一篇华为正规C,C++面试题及答案

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目