bzoj1033: [ZJOI2008]杀蚂蚁antbuster

bzoj1033: [ZJOI2008]杀蚂蚁antbuster
一道可以用来锻炼代码力的模拟。
也可能只是因为我太弱了


代码

#include
#include
#include
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
    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
        {
            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
        {
            mxm=r*r+1;
            for(j=0;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
            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
        while(a[i].hp<0&&i.now.X][a[i].now.Y]=0,liv--;
            if(a[i].cak)ck=0;
            for(j=i;j
            a[j]=a[j+1];
        }
        for(i=0;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
            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
    }
    printf("The game is going on\n%d\n",liv);
    for(j=0;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);
}

你可能感兴趣的:(模拟)