求调函数
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();
}