大膜你求条
查看原帖
大膜你求条
982155
封禁用户楼主2024/8/29 11:17

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;
}
2024/8/29 11:17
加载中...