表示疑惑
查看原帖
表示疑惑
767096
TKXZ133楼主2022/12/23 20:57

有很多疑惑:

对于样例:

1,在1时刻在(2,2)激发了类型为1的武器,杀死的老鼠应该是此时位于(1,2)的老鼠2啊,为什么显示死的是老鼠1。

2,类型为3的武器应该在4时刻爆炸,但此时老鼠2还在(2,1),为什么可以炸死老鼠2

对于题目:

1,小老鼠的成长是从它一出生的时刻开始的吗?

2,小老鼠是一个时间单位开始时计算还是结束时?

如果可以,顺便帮忙看看我哪里写错了:

#include <bits/stdc++.h>
using namespace std;
const int N=55,M=110;

//方向0,1,2,3分别代表北,东,南,西

int L,R,n,m,K,P,Limit,Time;//题目所给的
int mp[N][N][4];//第i,j点的四个方向是否有路
int in1,in2;
char in3,in4;
int vx[]={-1,0,1,0},vy[]={0,1,0,-1};
int mousecnt;
double eps=1e-6;

struct Mouse{
    int x,y,dir,sex;//坐标,方向,性别(1:雄,0:雌)
    int turns,grows,comatime;
//当前转向次数,当前成长状态,还要昏迷的时间
    int isreproducing;
//是否在繁殖
}mouse[M<<1];
struct Weapon{
    int x,y,type,t;
//投放坐标,类型,投放时间
}weapon[M];

double distance(int x1,int y1,int x2,int y2){return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}
int direction(char s){return (s=='E')?1:(s=='S')?2:(s=='W')?3:0;}
int rightturn(int x){return (x==3)?0:x+1;}
int leftturn(int x){return (x==0)?3:x-1;}

void Del(int p){//删除这只老鼠
    for(int i=p;i<mousecnt;i++)
        mouse[i]=mouse[i+1];
    mouse[mousecnt]={0,0,0,0,0,0,0,0};
    mousecnt--;
}

void reproduct(int p){//以第p只老鼠为亲本产生小老鼠
    for(int i=0;i<4;i++)
        if(mp[mouse[p].x][mouse[p].y][i]){
            mousecnt++;
            mouse[mousecnt]={mouse[p].x,mouse[p].y,i,1-i%2,0,7,0,0};
        }
}

void Activate_the_weapon(int p,int ntime){
    if((weapon[p].type!=3&&ntime==weapon[p].t)||(weapon[p].type==3&&ntime==weapon[p].t+4)){
        int x=weapon[p].x,y=weapon[p].y;
        if(weapon[p].type==1)
            for(int i=0;i<4;i++)//遍历四方向
                for(int j=0;j<=L;j++){//遍历长度
                    int xx=x+vx[i]*j,yy=y+vy[i]*j;
                    if(xx<1||xx>n||yy<0||yy>m) break;
                    for(int k=1;k<=mousecnt;k++)//遍历老鼠
                        if(mouse[k].x==xx&&mouse[k].y==yy) Del(k);
                    if(!mp[xx][yy][i]) break;//如果不能再延长则返回
                }
        if(weapon[p].type==2)
            for(int k=1;k<=mousecnt;k++)
                if(((double)R-distance(mouse[k].x,mouse[k].y,x,y))>-eps)
                    mouse[k].comatime+=3;//使其昏迷
        if(weapon[p].type==3)
            for(int k=1;k<=mousecnt;k++)
                if(mouse[k].x==x&&mouse[k].y==y) Del(k);//干掉它
        if(weapon[p].type==4)
            for(int k=1;k<=mousecnt;k++)
                if(mouse[k].x==x&&mouse[k].y==y) mouse[k].sex=1-mouse[k].sex;//改变性别
    }
}

void move_the_mouse(int p){
    if(mouse[p].comatime){
        mouse[p].comatime--;
        return ;
    }
    if(mouse[p].isreproducing){
        mouse[p].isreproducing--;
        if(mouse[p].isreproducing==1)//当还有一个单位时间就可以移动时产生小老鼠
            reproduct(p);
        if(mouse[p].isreproducing) return ;//还在繁殖就不管它
    }
    if(mouse[p].grows) mouse[p].grows--;//使其长大
    int x=mouse[p].x,y=mouse[p].y,dir=mouse[p].dir;
    if(mp[x][y][dir]){//该方向可行
        mouse[p].x+=vx[dir];
        mouse[p].y+=vy[dir];
    }
    else if(mp[x][y][rightturn(dir)]&&mp[x][y][leftturn(dir)]){//其余两方向可行
        if(mouse[p].turns%2==0) mouse[p].dir=rightturn(dir);
        else mouse[p].dir=leftturn(dir);
        mouse[p].turns++;
    }
    else if(mp[x][y][rightturn(dir)]||mp[x][y][leftturn(dir)]){//其中一方向可行
        if(mp[x][y][rightturn(dir)]) mouse[p].dir=rightturn(dir);
        else mouse[p].dir=leftturn(dir);
    }
    else mouse[p].dir=rightturn(dir);//否则右转
    for(int k=1;k<=mousecnt;k++){//遍历其余老鼠
        if(p==k) continue;
        if(mouse[k].comatime) continue;
        if(mouse[k].sex+mouse[p].sex!=1) continue;
        if(mouse[k].x!=mouse[p].x||mouse[k].y!=mouse[p].y) continue;
        if(mouse[k].grows||mouse[p].grows) continue;//判断是否可以匹配
        mouse[p].isreproducing=3;mouse[k].comatime=3;//让自己进入繁殖状态,让对方昏迷(笑
        break;
    }
}

int main(){
    // freopen("the.in","r",stdin);
    // freopen("the.out","w",stdout);
    cin>>L>>R>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++){
            cin>>in1;
            if(in1>=8) mp[i][j][3]=1,in1-=8;
            if(in1>=4) mp[i][j][2]=1,in1-=4;
            if(in1>=2) mp[i][j][1]=1,in1-=2;
            if(in1>=1) mp[i][j][0]=1,in1-=1;//拆分
        }
    cin>>K;
    for(int i=1;i<=K;i++){
        cin>>in1>>in2>>in3>>in4;
        mouse[i]={in1,in2,direction(in3),(in4=='X')?1:0,0,0,0,0};//新增老鼠
    } 
    mousecnt=K;
    cin>>P>>Limit;
    for(int i=1;i<=P;i++)
        cin>>weapon[i].type>>weapon[i].t>>weapon[i].x>>weapon[i].y;
    cin>>Time;
    for(int ntime=1;ntime<=Time;ntime++){
        for(int i=1;i<=P;i++)
            Activate_the_weapon(i,ntime);//先运行武器
        for(int i=1;i<=mousecnt;i++)
            move_the_mouse(i);//移动老鼠
        if(mousecnt>Limit){cout<<"-1\n";return 0;}
        // cout<<ntime<<'\n';
        // for(int i=1;i<=mousecnt;i++){
        //     cout<<mouse[i].x<<' '<<mouse[i].y<<' '<<mouse[i].dir;
        //     if(mouse[i].comatime) cout<<" comaing!\n";
        //     else cout<<'\n';
        // }
        // cout<<"---\n";
    }
    cout<<mousecnt<<'\n';
    return 0;
}
2022/12/23 20:57
加载中...