萌新30pts求条
查看原帖
萌新30pts求条
941575
Stars_visitor_tyw楼主2024/8/21 12:39
#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[205][250];
bool win=0, flyd=0;
int tsum, tradiu, thurt, tfirst;//tsum炮塔数,tradiu炮塔攻击范围,thurt炮塔伤害,tfirst拿蛋糕的蚂蚁(炮塔最先攻击的)
struct T
{
    int goal, x, y;
}t[250];
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=100;
    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=0x3fffffff;
            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||!mp[a[i].x][a[i].y].vis||a[i].isdie)continue;
        nantsum--;
        mp[a[i].x][a[i].y].vis=0;
        a[i].x=100,a[i].y=100,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();
}
//调试次数:30
2024/8/21 12:39
加载中...