rt.
#include<bits/stdc++.h>
#define int long long
using namespace std;
#define ueps 1e-10
const double siz_ant=0.5;
struct P
{
double x, y;
};
P make_stru(double x, double y)
{
P p={x,y};
return p;
}
P operator + (P a,P b)
{
P p=make_stru(a.x+b.x,a.y+b.y);
return p;
}
P operator - (P a,P b)
{
P p=make_stru(a.x-b.x,a.y-b.y);
return p;
}
int dpositive(double x)
{
if(fabs(x)<ueps){return 0;}
if(x<0)return -1;
return 1;
}
double get_dote(P a, P b){return (double)a.x*b.x+a.y*b.y;}
double get_len(P a){return (double)(sqrt((double)get_dote(a,a)));}
double crossing(P a, P b){return (double)a.x*b.y-a.y*b.x;}
double slope(P a){return (double)(a.y/a.x);}
double get_dis_segment(P a, P b, P c)
{
P n1=c-b, n2=a-b, n3=a-c;
if(dpositive(get_dote(n1,n2))<0)return get_len(n2);
if(dpositive(get_dote(n1,n3))>0)return get_len(n3);
return fabs(crossing(n1,n2)/get_len(n1));
}
double get_dis_point(int x1, int x2, int y1, int y2){return sqrt((double)((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)));}
int n, m, lst=1, endt;//参考tj1加了这里的优化,第一只活着的蚂蚁。endt结束时间
struct M
{
int sum;//某点信息素
bool vis;//占用与否
}mp[25][25];
bool win=0, flyd=0;
int tsum, tradiu, thurt, tfirst;//tsum炮塔数,tradiu炮塔攻击范围,thurt炮塔伤害,tfirst拿蛋糕的蚂蚁(炮塔最先攻击的)
struct T
{
int goal, x, y;
}t[25];
int bantsum=0;//出生蚂蚁数
int nantsum=0;//当前蚂蚁数
struct ANT
{
int x, y, old, level, blood;
double Fblood;
int lstx, lsty;
bool get_cake,isdie;
}a[300005];
void born()//蚂蚁出生
{
if(nantsum>=6)return ;
if(mp[0][0].vis)return ;
mp[0][0].vis=1;
bantsum++,nantsum++;
a[bantsum].x=a[bantsum].y=a[bantsum].old=0;
a[bantsum].lstx=a[bantsum].lsty=114514,a[bantsum].level=((bantsum-1)/6)+1;
a[bantsum].isdie=a[bantsum].get_cake=0;
double nblood=floor(4*pow(1.1,a[bantsum].level));
a[bantsum].blood=(int)nblood;
a[bantsum].Fblood=nblood;
}
void out_information()
{
for(int i=lst;i<=bantsum;i++)
{
if(a[i].isdie)continue;
if(!a[i].get_cake)
{
mp[a[i].x][a[i].y].sum+=2;
}
else mp[a[i].x][a[i].y].sum+=5;
}
}
int dx[]={0,1,0,-1};
int dy[]={1,0,-1,0};
bool check_release_ants(int x, int y)//检查是否能放蚂蚁
{if(x<0||x>n||y<0||y>m||mp[x][y].vis)return 0;else return 1;}
void move()
{
for(int i=lst;i<=bantsum;i++)
{
if(a[i].isdie)continue;
int maxinformation=-1, ndirec=-1, direc=-1, nx, ny, nd;
for(int j=0;j<4;j++)
{
nx=a[i].x+dx[j];
ny=a[i].y+dy[j];
if(!check_release_ants(nx,ny))continue;
if(nx==a[i].lstx&&ny==a[i].lsty)continue;
if(mp[nx][ny].sum>maxinformation)
{
maxinformation=mp[nx][ny].sum;
direc=j;
}
}
if(a[i].old%5==4&&direc!=-1)
{
maxinformation=-1;
ndirec=-1;
for(int j=1;j<5;j++)
{
nd=(direc-j)%4;
if(nd<0)nd+=4;
nx=a[i].x+dx[nd];
ny=a[i].y+dy[nd];
if(!check_release_ants(nx,ny))continue;
if(nx==a[i].lstx&&ny==a[i].lsty)continue;
if(maxinformation<mp[nx][ny].sum)
{
maxinformation=mp[nx][ny].sum;
ndirec=nd;
break;
}
}
}
a[i].lstx=a[i].x;
a[i].lsty=a[i].y;
if(maxinformation==-1)continue;
if(a[i].old%5==4)
{
a[i].x+=dx[ndirec];
a[i].y+=dy[ndirec];
mp[a[i].lstx][a[i].lsty].vis=0;
mp[a[i].x][a[i].y].vis=1;
}
else
{
a[i].x+=dx[direc];
a[i].y+=dy[direc];
mp[a[i].lstx][a[i].lsty].vis=0;
mp[a[i].x][a[i].y].vis=1;
}
}
}
void check_cake()
{
if(flyd)return ;
for(int i=lst;i<=bantsum;i++)
{
if(a[i].isdie)continue;
if(a[i].x==n&&a[i].y==m)
{
tfirst=i;
flyd=1;
a[i].get_cake=1;
a[i].blood+=(int)(a[i].Fblood/2);
a[i].blood=min((int)(a[i].Fblood),a[i].blood);
return ;
}
}
}
void firetoant()//炸蚂蚁!!!
{
for(int i=1;i<=tsum;i++)
{
double tdis=get_dis_point(t[i].x,t[i].y,a[tfirst].x,a[tfirst].y);
if(!flyd||tdis-(double)(tradiu)>ueps)
{
double tpdis, mindis=114514191981000.0;
for(int j=lst;j<=bantsum;j++)
{
if(a[j].isdie)continue;
tpdis=get_dis_point(t[i].x,t[i].y,a[j].x,a[j].y);
if(tpdis<mindis)
{
mindis=tpdis;
t[i].goal=j;
}
}
if(mindis-(double)(tradiu)>ueps)
{
t[i].goal=0;continue;
}
a[t[i].goal].blood-=thurt;
}
else
{
t[i].goal=tfirst;
P aa=make_stru(a[t[i].goal].x,a[t[i].goal].y);
P bb=make_stru(t[i].x,t[i].y);
for(int j=lst;j<=bantsum;j++)
{
if(a[j].isdie)continue;
if(a[j].get_cake)
{
a[j].blood-=thurt;
continue;
}
P pp=make_stru(a[j].x,a[j].y);
double ngdis=get_dis_segment(pp,aa,bb);
if(ngdis-siz_ant<ueps)
{
a[j].blood-=thurt;
}
}
}
}
}
void clearmp()
{
for(int i=lst;i<=bantsum;i++)
{
if(a[i].blood>=0||a[i].isdie||!mp[a[i].x][a[i].y].vis)continue;
nantsum--;
mp[a[i].x][a[i].y].vis=0;
a[i].x=114514,a[i].y=114514,a[i].isdie=1;
if(a[i].get_cake)flyd=0,tfirst=0;
}
}
void check_continue()
{
if(!flyd)return ;
for(int i=lst;i<=bantsum;i++)
{
if(a[i].isdie||a[i].x||a[i].y||!a[i].get_cake)continue;
win=1;
break;
}
}
void A_grow()
{
for(int i=lst;i<=bantsum;i++)
{
if(a[i].isdie)continue;
a[i].old++;
}
}
void minusinformation(){for(int i=0;i<=n;i++)for(int j=0;j<=m;j++)if(mp[i][j].sum)mp[i][j].sum--;}
void in()
{
cin>>n>>m>>tsum>>thurt>>tradiu;
for(int i=1;i<=tsum;i++)
{
cin>>t[i].x>>t[i].y;
mp[t[i].x][t[i].y].vis=1;
}
cin>>endt;
}
void work()
{
for(int i=1;i<=endt;i++)
{
born();
out_information();
move();
check_cake();
firetoant();
clearmp();
check_continue();
if(win)
{
cout<<"Game over after "<<i<<" seconds\n";
break;
}
A_grow();
minusinformation();
for(int j=lst;j<=bantsum;j++)
{
if(a[j].isdie)continue;
lst=j;
break;
}
}
}
void out()
{
if(!win)
{
cout<<"The game is going on\n";
}
cout<<nantsum<<"\n";
for(int i=lst;i<=bantsum;i++)
{
if(a[i].isdie)continue;
cout<<a[i].old<<" "<<a[i].level<<" "<<a[i].blood<<" "<<a[i].x<<" "<<a[i].y<<"\n";
}
}
signed main()
{
in();
work();
out();
}
//调试次数:25