30分,应该是大炮大蚂蚁的问题
#include<bits/stdc++.h>
using namespace std;
int n,m,T;
int last=1;
int End;
int win;
int cakefly;
int artsum;
int artrange;
int arthurt;
int artget;
int bornsum;
int nowsum;
double antsize=0.5;
struct map
{
int ifmt;
int use;
}g[1001][1001];
struct artillery
{
int get;
int x,y;
}t[200001];
struct ant
{
int x,y;
int old;
int level;
int blood;
double st_blood;
int from_x;
int from_y;
int get;
int dead;
}a[200001];
void antborn()
{
if(nowsum>=6) return;
if(g[0][0].use) return;
bornsum++;
nowsum++;
g[0][0].use=1;
a[bornsum].x=0;
a[bornsum].y=0;
a[bornsum].from_x=1000;
a[bornsum].from_x=1000;
a[bornsum].old=0;
a[bornsum].level=(bornsum-1)/6+1;
a[bornsum].dead=0;
a[bornsum].get=0;
a[bornsum].st_blood=floor(4.0*pow(1.1,a[bornsum].level));
a[bornsum].blood=(int)(floor(4.0*pow(1.1,a[bornsum].level)));
return;
}
void releaseifma()
{
for(int i=last;i<=bornsum;i++)
{
if(a[i].dead) continue;
if(!a[i].get) g[a[i].x][a[i].y].ifmt+=2;
else g[a[i].x][a[i].y].ifmt+=5;
}
return;
}
int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
bool ck(int x,int y)
{
if(x<0||x>n||y<0||y>m||g[x][y].use) return 0;
else return 1;
}
void antmove()
{
for(int i=last;i<=bornsum;i++)
{
if(a[i].dead) continue;
int maxifmt=-1;
int fivefx=-1;
int fx=-1;
int nx;
int ny;
int nd;
for(int j=0;j<4;j++)
{
nx=a[i].x+dx[j];
ny=a[i].y+dy[j];
if(!ck(nx,ny)) continue;
if(nx==a[i].from_x&&ny==a[i].from_y) continue;
if(maxifmt<g[nx][ny].ifmt)
{
maxifmt=g[nx][ny].ifmt;
fx=j;
}
}
if((a[i].old+1)%5==0&&fx!=-1)
{
maxifmt=-1;
fivefx=-1;
for(int j=1;j<=4;j++)
{
nd=(fx-j)%4;
if(nd<0) nd+=4;
nx=a[i].x+dx[nd];
ny=a[i].y+dy[nd];
if(!ck(nx,ny)) continue;
if(nx==a[i].from_x&&ny==a[i].from_y) continue;
if(maxifmt<g[nx][ny].ifmt)
{
maxifmt=g[nx][ny].ifmt;
fivefx=nd;
break;
}
}
}
a[i].from_x=a[i].x;
a[i].from_y=a[i].y;
if(maxifmt==-1) continue;
if((a[i].old+1)%5==0)
{
a[i].x+=dx[fivefx];
a[i].y+=dy[fivefx];
g[a[i].from_x][a[i].from_y].use=0;
g[a[i].x][a[i].y].use=1;
}
else
{
a[i].x+=dx[fx];
a[i].y+=dy[fx];
g[a[i].from_x][a[i].from_y].use=0;
g[a[i].x][a[i].y].use=1;
}
}
return;
}
void getcake()
{
if(cakefly) return;
for(int i=last;i<=bornsum;i++)
{
if(a[i].dead) continue;
if(a[i].x==n&&a[i].y==m)
{
artget=i;
cakefly=1;
a[i].get=1;
a[i].blood+=(int)a[i].st_blood/2;
a[i].blood=min((int)a[i].st_blood,a[i].blood);
return;
}
}
return;
}
double dist(int x1,int y1,int x2,int y2)
{
return sqrt(((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))*1.0);
}
pair<double,double> Getline(int a,int b,int c,int d)
{
return {((b*c-a*d)*1.0/(c-a)-b)*1.0/a,(b*c-a*d)*1.0/(c-a)};
}
int ckk(int a,int b,int c,int d)
{
if(a>=c)
{
if(b>=d) return 0;
else return 1;
}
else
{
if(b>=d) return 2;
else return 3;
}
}
void artfire()
{
for(int i=1;i<=artsum;i++)
{
double dis=dist(t[i].x,t[i].y,a[artget].x,a[artget].y);
if(!artget||dis-(double)artrange>1e-10)
{
double mindis=0x3f3f3f3f;
for(int j=last;j<=bornsum;j++)
{
if(a[j].dead) continue;
double midis=dist(t[i].x,t[i].y,a[j].x,a[j].y);
if(mindis-midis>1e-10)
{
mindis=midis;
t[i].get=j;
}
}
if(mindis-(double)artrange>1e-10)
{
t[i].get=0;
continue;
}
a[t[i].get].blood-=arthurt;
}
else
{
t[i].get=artget;
pair<double,double>line=Getline(t[i].x,t[i].y,a[artget].x,a[artget].y);
for(int j=last;j<=bornsum;j++)
{
if(a[j].dead) continue;
if(a[j].get==j)
{
a[j].blood-=arthurt;
}
double midis=dist(t[i].x,t[i].y,a[j].x,a[j].y);
double yy=a[j].x*line.first+a[j].y;
if(fabs(yy-line.second)<1e-10&&dis-midis>1e-10&&ckk(t[i].x,t[i].y,a[j].x,a[j].y)==ckk(t[i].x,t[i].y,a[artget].x,a[artget].y));
{
a[j].blood-=arthurt;
}
}
}
}
return;
}
void clearbattlefield()
{
for(int i=last;i<=bornsum;i++)
{
if(a[i].blood>=0) continue;
if(!g[a[i].x][a[i].y].use) continue;
if(a[i].dead) continue;
nowsum--;
g[a[i].x][a[i].y].use=0;
a[i].x=1000;
a[i].y=1000;
a[i].dead=1;
if(a[i].get)
{
a[i].get=0;
cakefly=0;
artget=0;
}
}
return;
}
void checkgame()
{
if(!cakefly) return;
for(int i=last;i<=bornsum;i++)
{
if(a[i].dead) continue;
if(a[i].x!=0||a[i].y!=0) continue;
if(!a[i].get) continue;
win=1;
break;
}
return;
}
void antgrow()
{
for(int i=last;i<=bornsum;i++)
{
if(a[i].dead) continue;
a[i].old++;
}
return;
}
void ifmtgo()
{
for(int i=0;i<=n;i++)
{
for(int j=0;j<=m;j++)
{
if(g[i][j].ifmt) g[i][j].ifmt--;
}
}
return;
}
void read()
{
cin>>n>>m;
cin>>artsum>>arthurt>>artrange;
for(int i=1;i<=artsum;i++)
{
cin>>t[i].x>>t[i].y;
g[t[i].x][t[i].y].use=1;
}
cin>>End;
return;
}
void work()
{
for(T=1;T<=End;T++)
{
antborn();
releaseifma();
antmove();
getcake();
artfire();
clearbattlefield();
checkgame();
if(win)
{
printf("Game over after %d seconds\n",t);
break;
}
antgrow();
ifmtgo();
for(int i=last;i<=bornsum;i++)
{
if(a[i].dead) continue;
else
{
last=i;
break;
}
}
}
return;
}
void write()
{
if(!win) cout<<"The game is going on\n";
cout<<nowsum<<"\n";
for(int i=last;i<=bornsum;i++)
{
if(a[i].dead) continue;
cout<<a[i].old<<" "<<a[i].level<<" "<<a[i].blood<<" "<<a[i].x<<" "<<a[i].y<<"\n";
}
}
int main()
{
read();
work();
write();
return 0;
}