bzoj1033: [ZJOI2008]杀蚂蚁antbuster
一道可以用来锻炼代码力的模拟。
也可能只是因为我太弱了
代码
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int m2[9][9],mx[]={0,1,0,-1},my[]={1,0,-1,0};
int i,j,k,brn,liv,tpx,tpy,MXX,MXY,tmp,mxm;
double pw[40000];
bool ck,m1[9][9],mov[4];
struct loc{int X,Y;}p[20],zer;
struct ant{int ag,lv,hp;loc now,pre;bool cak;}a[6];
int dis(loc x,loc y)
{return (x.X-y.X)*(x.X-y.X)+(x.Y-y.Y)*(x.Y-y.Y);}
int n,m,s,d,r,x,y,t;
int main()
{
scanf("%d%d%d%d%d",&n,&m,&s,&d,&r);
for(i=0;i<s;i++)
scanf("%d%d",&p[i].X,&p[i].Y),m1[p[i].X][p[i].Y]=1;
scanf("%d",&t);
zer.X=zer.Y=0;
pw[0]=4;
for(i=1;i<=t/6+1;i++)
pw[i]=pw[i-1]*1.1;
for(k=1;k<=t;k++)
{
if(liv<6&&!m1[0][0])
{
a[liv].ag=a[liv].cak=0;
a[liv].lv=(brn++)/6+1;
a[liv].hp=pw[a[liv].lv];
a[liv].pre=a[liv++].now=zer;
m1[0][0]=1;
}
for(i=0;i<liv;i++)
{
m2[a[i].now.X][a[i].now.Y]+=a[i].cak?5:2;
tmp=mxm=0;
for(j=0;j<4;j++)
{
mov[j]=1;
tpx=a[i].now.X+mx[j],tpy=a[i].now.Y+my[j];
if((tpx==a[i].pre.X&&tpy==a[i].pre.Y)||tpx>n||tpy>m||tpy<0||tpx<0||
m1[tpx][tpy])mov[j]=0,tmp++;
else mxm=max(mxm,m2[tpx][tpy]);
}
a[i].pre=a[i].now;
if(tmp<4)
{
m1[a[i].now.X][a[i].now.Y]=0;
for(j=0;;j++)
{
tpx=a[i].now.X+mx[j],tpy=a[i].now.Y+my[j];
if(mov[j]&&m2[tpx][tpy]==mxm)break;
}
if(!((a[i].ag+1)%5))
for(j=(j+3)%4;;j=(j+3)%4)
{
tpx=a[i].now.X+mx[j],tpy=a[i].now.Y+my[j];
if(mov[j])break;
}
a[i].now.X=tpx,a[i].now.Y=tpy;
m1[tpx][tpy]=1;
}
if(!ck&&a[i].now.X==n&&a[i].now.Y==m)
ck=1,a[i].cak=1,a[i].hp=min(a[i].hp+pw[a[i].lv]/2,pw[a[i].lv]);
}
for(i=0;i<s;i++)
{
mxm=r*r+1;
for(j=0;j<liv;j++)
{
tmp=dis(a[j].now,p[i]);
if(tmp<=r*r){mxm=min(mxm,tmp);if(a[j].cak)break;}
}
if(mxm>r*r)continue;
if(j==liv)
for(j=0;dis(a[j].now,p[i])>mxm;j++);
tmp=j,x=a[j].now.X-p[i].X,y=a[j].now.Y-p[i].Y;
MXX=max(a[j].now.X,p[i].X),tpx=min(a[j].now.X,p[i].X);
MXY=max(a[j].now.Y,p[i].Y),tpy=min(a[j].now.Y,p[i].Y);
for(j=0;j<liv;j++)
if(a[j].now.X>=tpx&&a[j].now.X<=MXX&&a[j].now.Y>=tpy&&a[j].now.Y<=MXY
&&fabs((a[j].now.X-p[i].X)*y-(a[j].now.Y-p[i].Y)*x)/sqrt(x*x+y*y)<=0.5)
a[j].hp-=d;
}
for(i=0;i<liv;i++)
while(a[i].hp<0&&i<liv)
{
m1[a[i].now.X][a[i].now.Y]=0,liv--;
if(a[i].cak)ck=0;
for(j=i;j<liv;j++)
a[j]=a[j+1];
}
for(i=0;i<liv;i++)
if(a[i].cak&&(!a[i].now.X)&&(!a[i].now.Y))
{
printf("Game over after %d seconds\n%d\n",k,liv);
for(j=0;j<liv;j++)
printf("%d %d %d %d %d\n",a[j].ag,a[j].lv,a[j].hp,a[j].now.X,a[j].now.Y);
return 0;
}
for(i=0;i<=n;i++)
for(j=0;j<=m;j++)
if(m2[i][j])m2[i][j]--;
for(i=0;i<liv;a[i++].ag++);
}
printf("The game is going on\n%d\n",liv);
for(j=0;j<liv;j++)
printf("%d %d %d %d %d\n",a[j].ag,a[j].lv,a[j].hp,a[j].now.X,a[j].now.Y);
}