悬 3 关,求调一个函数
查看原帖
悬 3 关,求调一个函数
482610
Mortidesperatslav楼主2023/11/27 20:15

求调函数

P2586


void mov(int x){
	int nx=lant[x].x,ny=lant[x].y;
	int mxxs=-1,mfx=0;
	for(int fx=1;fx<=4;fx++){
		if(invalid(nx+dx[fx],ny+dy[fx]))continue;
		if(mp[nx+dx[fx]][ny+dy[fx]]>mxxs)mxxs=mp[nx+dx[fx]][ny+dy[fx]],mfx=fx;
	}
	if(mxxs==-1)return;
	if(lant[x].old%5==4)
		for(int zn=1;zn<=4;zn++){
			mfx=(mfx-1+3)%4+1;
			if(!invalid(nx+dx[mfx],ny+dy[mfx]))break;
		}
	mpp[lant[x].x][lant[x].y]=0;
	lant[x].x+=dx[mfx];
	lant[x].y+=dy[mfx];
	mpp[lant[x].x][lant[x].y]=-1;
}

以下为完整代码

#include<bits/stdc++.h>
using namespace std;
int sec=0,n,m,s,d,r,t,acnt=0,lcnt=0,mp[22][22],mpp[22][22];
int dx[]={0,0,-1,0,1};
int dy[]={0,1,0,-1,0};
bool cksafe=1;
struct ant{
	bool death,cake;
	double mxheal,heal;
	int old,x,y,lv,sx,sy;
	ant(){
		mxheal=0;
		death=0;
		cake=0;
		heal=0;
		old=0;
		x=0;
		y=0;
		lv=0;
	}
}lant[300005];
struct pw{
	int x,y;
	pw(){
		x=0,y=0;
	}
}pwr[50];
void print(){
	for(int i=1;i<=acnt;i++)
		if(!lant[i].death){
			cout<<lant[i].old<<" "<<lant[i].lv<<" "<<lant[i].heal<<" ";
			cout<<lant[i].x<<" "<<lant[i].y<<"\n";
		}
}
void crtant(){
	if(mpp[0][0]==-1||lcnt>=6)return;
	acnt++;
	lant[acnt].heal=(int)(4*pow(1.1,(acnt+5)/6));
	lant[acnt].mxheal=lant[acnt].heal;
	lant[acnt].lv=(acnt+5)/6;
	lant[acnt].sx=114;
	lant[acnt].sy=514;
	mpp[0][0]=-1;
	lcnt++;
}
bool invalid(int x,int y){
	if(x<0||x>n||y<0||y>m)return 1;
	if(mpp[x][y]==-1)return 1;
	return 0;
}
void mov(int x){
	int nx=lant[x].x,ny=lant[x].y;
	int mxxs=-1,mfx=0;
	for(int fx=1;fx<=4;fx++){
		if(invalid(nx+dx[fx],ny+dy[fx]))continue;
		if(mp[nx+dx[fx]][ny+dy[fx]]>mxxs)mxxs=mp[nx+dx[fx]][ny+dy[fx]],mfx=fx;
	}
	if(mxxs==-1)return;
	if(lant[x].old%5==4)
		for(int zn=1;zn<=4;zn++){
			mfx=(mfx-1+3)%4+1;
			if(!invalid(nx+dx[mfx],ny+dy[mfx]))break;
		}
	mpp[lant[x].x][lant[x].y]=0;
	lant[x].x+=dx[mfx];
	lant[x].y+=dy[mfx];
	mpp[lant[x].x][lant[x].y]=-1;
}
void amov(){
	for(int i=1;i<=acnt;i++)if(!lant[i].death)mov(i);
}
void xxs(){
	for(int i=1;i<=acnt;i++){
		if(!lant[i].death&&!lant[i].cake)mp[lant[i].x][lant[i].y]+=2;
		if(!lant[i].death&&lant[i].cake)mp[lant[i].x][lant[i].y]+=5;
	}
}
void chkck(){
	for(int i=1;i<=acnt;i++)
		if(!lant[i].death&&lant[i].x==n&&lant[i].y==m&&cksafe){
			cksafe=0;
			lant[i].cake=1;
			lant[i].heal+=(int)(lant[i].mxheal/2);
			if(lant[i].heal>lant[i].mxheal)lant[i].heal=lant[i].mxheal;
		}
}
void qcant(int x){
	lant[x].death=1;
	if(lant[x].cake){
		lant[x].cake=0;
		cksafe=1;
	}
	mpp[lant[x].x][lant[x].y]=0;
	lcnt--;
}
void qlzc(){
	for(int i=1;i<=acnt;i++)
		if(!lant[i].death&&lant[i].heal<0.00)qcant(i);
}
double dis(int x1,int x2,int y1,int y2){
	return (double)sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
bool cmp(double a,int b){
	if(a>double(b))return 0;
	else return 1;
}
void atk(int x){
	int tx=pwr[x].x;
	int ty=pwr[x].y;
	if(!cksafe){
		int tgt=0;
		for(int i=1;i<=acnt;i++)
			if(lant[i].cake&&!lant[i].death){
				tgt=i;
				break;
			}
		if(cmp(dis(lant[tgt].x,tx,lant[tgt].y,ty),r)==0){
			double mdis=114514.1919810;
			int md=-1;
			for(int i=1;i<=acnt;i++)
				if(!lant[i].death)
					if(dis(lant[i].x,tx,lant[i].y,ty)<mdis-1e-9){
						mdis=dis(lant[i].x,tx,lant[i].y,ty);
						md=i;
					}
			if(md==-1||cmp(mdis,r)==0)return;
			lant[md].heal-=d;
		}else{
			lant[tgt].heal-=d;
		}
	}
	double mdis=114514.1919810;
	int md=-1;
	for(int i=1;i<=acnt;i++)
		if(!lant[i].death)
			if(dis(lant[i].x,tx,lant[i].y,ty)<mdis){
				mdis=dis(lant[i].x,tx,lant[i].y,ty);
				md=i;
			}
	if(md==-1||cmp(mdis,r)==0)return;
	lant[md].heal-=d;
}
void patk(){
	for(int i=1;i<=s;i++)atk(i);
}
void isover(){
	for(int i=1;i<=acnt;i++)
		if(!lant[i].death&&lant[i].x==0&&lant[i].y==0&&!cksafe&&lant[i].cake){
			cout<<"Game over after "<<sec<<" seconds\n"<<lcnt<<"\n";
			print();
			exit(0);
		}
}
void mxxs(){
	for(int i=0;i<=n;i++)
		for(int j=0;j<=m;j++)
			if(mp[i][j]>0)mp[i][j]--;
}
void oldp(){
	for(int i=1;i<=acnt;i++)if(!lant[i].death)lant[i].old++;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	cin>>s>>d>>r;
	for(int i=1;i<=s;i++){
		cin>>pwr[i].x>>pwr[i].y;
		mpp[pwr[i].x][pwr[i].y]=-1;
	}
	cin>>t;
	for(int i=1;i<=t;i++){
		sec++;
		crtant();
		xxs();
		amov();
		chkck();
		patk();
		qlzc();
		isover();
		mxxs();
		oldp();
	}
	cout<<"The game is going on\n"<<lcnt<<"\n";
	print();
}
2023/11/27 20:15
加载中...