有很多疑惑:
对于样例:
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;
}