大模拟 猪国杀 杀蚂蚁
杀蚂蚁
1.所有炮台是一起选择目标,选完之后一起打
2.如果蚂蚁这一秒没有移动位置,仍然要判断它是否会抗蛋糕,因为上一秒抗蛋糕的可能死了
3.蚂蚁的半径是0.5
4.只有洞口没有蚂蚁时新蚂蚁才会出来
链表存蚂蚁比较方便
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define maxn 400005 using namespace std; int n,m,T; int num_po,hurt,R,pos_cake;//pos_cake 蛋糕在的蚂蚁编号 int cnt=0,now; int last,pre[maxn],nex[maxn]; int vis[10][10],w[10][10]; bool die[maxn]; struct node { int w,f; }b[5]; struct node2 { double dis; int id; }c[maxn]; bool cmp(const node&x,const node&y) { return x.w==y.w ? x.f<y.f : x.w>y.w; } bool cmp2(const node2&x,const node2&y) { return x.dis==y.dis ? x.id<y.id : x.dis<y.dis; } inline int read() { int x=0; char ch=getchar(); while(ch<'0'||ch>'9') ch=getchar(); while(ch>='0'&&ch<='9'){ x=x*10+ch-'0'; ch=getchar(); } return x; } double sq(int x)//平方 { return (double)x*(double)x*1.0; } struct Ant//蚂蚁信息 { int id; int x,y,lastx,lasty;//当前位置 上一次位置 int blood,age,d,ti,bl;//血量 年龄 等级 活动时间 初始血量 bool cake; //有没有抗蛋糕 double quickpow(int x) { double op=1.0,e=1.1; while(x){ if(x&1) op*=e; e*=e; x>>=1; } return op; } void init() { id=cnt; if(id%6==0) d=id/6; else d=id/6+1; blood=(int)((double)4*quickpow(d)); bl=blood; age=ti=x=y=0; lastx=lasty=0; vis[x][y]++; //该点的蚂蚁数 } void del() { if(die[id]) return ; die[id]=1; now--; int f=id; nex[pre[f]]=nex[f]; pre[nex[f]]=pre[f]; vis[x][y]--; if(cake) pos_cake=0; cake=0; } void left()//留信息素 { ti++; if(cake) w[x][y]+=5; else w[x][y]+=2; } bool check(int x,int y) { if(x==lastx&&y==lasty) return 0; else return 1; } void getcake() { if(x==n&&y==m&&!pos_cake) { cake=1,pos_cake=id; blood=min(bl,blood+bl/2); } } void move() { int op=0; if(y+1<=m&&!vis[x][y+1]&&check(x,y+1)) op++,b[op].f=0,b[op].w=w[x][y+1]; if(x+1<=n&&!vis[x+1][y]&&check(x+1,y)) op++,b[op].f=1,b[op].w=w[x+1][y]; if(y-1>=0&&!vis[x][y-1]&&check(x,y-1)) op++,b[op].f=2,b[op].w=w[x][y-1]; if(x-1>=0&&!vis[x-1][y]&&check(x-1,y)) op++,b[op].f=3,b[op].w=w[x-1][y];//0 东,1 南,2 西,3,北 lastx=x; lasty=y; if(!op) return ; sort(b+1,b+op+1,cmp); if(ti%5==0) { int t=b[1].f,find=0; for(int i=(t-1+4)%4;i!=b[1].f;i=(i-1+4)%4){ for(int j=1;j<=op;j++) if(b[j].f==i){ find=1; break; } if(find){ b[1].f=i;break; } } } vis[x][y]--; if(b[1].f==0) y=y+1; if(b[1].f==1) x=x+1; if(b[1].f==2) y=y-1; if(b[1].f==3) x=x-1; vis[x][y]++; } }a[maxn]; struct Po { int x,y; int aim; double getdis(int f) { return sqrt(sq(x-a[f].x)+sq(y-a[f].y)); } double getdis2(double K,double B,int f) { double t1=fabs(K*(double)a[f].x-(double)a[f].y+B); double t2=sqrt(K*K+1.0); return t1/t2; } void getaim() { double dis; if(pos_cake){ dis=getdis(pos_cake); if(dis<=(double)R){ aim=pos_cake; return ;} } int op=0; for(int i=nex[0];i;i=nex[i]) { dis=getdis(i); if(dis<=(double)R){ ++op; c[op].dis=dis; c[op].id=i; } } if(!op){ aim=0; return ;} sort(c+1,c+op+1,cmp2); aim=c[1].id; } void fight() { if(!aim) return ; a[aim].blood-=hurt; if(a[aim].blood<0) a[aim].del(); int may=max(a[aim].y,y),miy=min(a[aim].y,y); int mx =max(a[aim].x,x),mix=min(a[aim].x,x); if(a[aim].x==x){ for(int j=nex[0];j;j=nex[j]) if(a[j].x==x&&miy<=a[j].y&&a[j].y<=may&&j!=aim) { a[j].blood-=hurt; if(a[j].blood<0) a[j].del(); } return ; } double K=(double)(a[aim].y-y)/(double)(a[aim].x-x),B=y-K*x; double dis; for(int j=nex[0];j;j=nex[j]) if(mix<=a[j].x&&a[j].x<=mx&&miy<=a[j].y&&a[j].y<=may&&j!=aim){ dis=getdis2(K,B,j); if(dis<=0.50000){ a[j].blood-=hurt; if(a[j].blood<0) a[j].del(); } } return ; } }p[25]; void tower_fight() { for(int i=1;i<=num_po;i++) p[i].getaim(); for(int i=1;i<=num_po;i++) p[i].fight(); } void mapinit() { for(int i=0;i<=n;i++) for(int j=0;j<=m;j++) w[i][j]=max(0,w[i][j]-1);//信息素 } void print(int x) { printf("Game over after %d seconds\n",x); printf("%d\n",now); for(int j=nex[0];j;j=nex[j]) printf("%d %d %d %d %d\n",a[j].age,a[j].d,a[j].blood,a[j].x,a[j].y); exit(0); } int main() { //freopen("antbuster_ex.in","r",stdin); //freopen("antbuster_ex.out","w",stdout); int x,y,last=0; n=read(); m=read(); num_po=read(); hurt=read(); R=read(); for(int i=1;i<=num_po;i++) { p[i].x=read(); p[i].y=read(); vis[p[i].x][p[i].y]=10; p[i].aim=0; } T=read(); for(int i=1;i<=T;i++) { if(!now) last=0;//last 上一秒最后一只蚂蚁的编号 else{ for(int j=nex[0];j;j=nex[j]) if(j) last=j; } if(now<6&&!vis[0][0]) { cnt++; now++; a[cnt].init(); nex[last]=cnt; pre[cnt]=last; } for(int j=nex[0];j;j=nex[j]) { a[j].left(); a[j].move(); } for(int j=nex[0];j;j=nex[j]) a[j].getcake(); tower_fight(); mapinit(); if(pos_cake){ int t=pos_cake; if(a[t].x==0&&a[t].y==0) print(i); } for(int j=nex[0];j;j=nex[j]) a[j].age++; } printf("The game is going on\n"); printf("%d\n",now); for(int j=nex[0];j;j=nex[j]) printf("%d %d %d %d %d\n",a[j].age,a[j].d,a[j].blood,a[j].x,a[j].y); return 0; }猪国杀
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define maxn 2001
using namespace std;
int n,m;
struct Charator
{
int rl;
int he,tl,q[maxn*2];
int num[9];
bool v[maxn*2],id;
}a[12];
int tl[12];
int s[maxn],top;
int pre[12],nex[12];
bool ti[12],die[12],zb[12];
bool mark[12];
int pos_M,die_num,f_num;
bool fail=0;
int getid(char x)
{
if(x=='P') return 1;
if(x=='K') return 2;
if(x=='D') return 3;
if(x=='F') return 4;
if(x=='N') return 5;
if(x=='W') return 6;
if(x=='J') return 7;
if(x=='Z') return 8;
}
char getid2(int x)
{
if(x==1) return 'P';
if(x==2) return 'K';
if(x==3) return 'D';
if(x==4) return 'F';
if(x==5) return 'N';
if(x==6) return 'W';
if(x==7) return 'J';
if(x==8) return 'Z';
}
void getp(int x,int n)
{
while(n--)
{
if(!top) top=1;
a[x].q[a[x].tl++]=s[top];
a[x].num[s[top]]++; top--;
}
}
int getaim(int x)
{
if(a[x].rl==1)
{
for(int i=nex[x];i!=x;i=nex[i])
if(mark[i]||(ti[i]&&a[i].rl==3)) return i;
return 0;
}
if(a[x].rl==2)
{
for(int i=nex[x];i!=x;i=nex[i])
if(ti[i]&&a[i].rl==3) return i;
return 0;
}
if(a[x].rl==3) return pos_M;
}
void print()
{
if(fail) printf("FP\n");
else printf("MP\n");
for(int i=1;i<=n;i++)
if(die[i]) printf("DEAD\n");
else{
for(int j=a[i].he;j<a[i].tl;j++)
if(!a[i].v[j]) printf("%c ",getid2(a[i].q[j]));
printf("\n");
}
exit(0);
}
void del(int x)
{
die[x]=1;
pre[nex[x]]=pre[x];
nex[pre[x]]=nex[x];
if(a[x].rl==1){ fail=1; print(); }
if(a[x].rl==3) die_num++;
if(die_num==f_num) print();
}
void qp(int x,int type,int n)
{
a[x].num[type]-=n;
for(int i=a[x].he;i<a[x].tl;i++)
if(!a[x].v[i]&&a[x].q[i]==type){
a[x].v[i]=1;
n--;
if(!n) break;
}
while(a[x].v[a[x].he]) a[x].he++;
return ;
}
void waste()
{
int x=pos_M;
a[x].he=a[x].tl; zb[x]=0;
for(int j=1;j<=8;j++) a[x].num[j]=0;
}
void make_p(int x,int w)
{
if(w){
tl[x]++; qp(x,1,1);
return ;
}
int op=1-tl[x];
if(op>a[x].num[1]) del(x);
else{ qp(x,1,op); tl[x]=1; }
}
void defend_k(int x)
{
if(a[x].num[3]){ qp(x,3,1); return ; }
tl[x]--;
if(tl[x]<=0) make_p(x,0);
}
void make_k(int x,int aim)
{
qp(x,2,1);
ti[x]=1; mark[x]=0;
defend_k(aim);
if(die[aim]&&a[aim].rl==3) getp(x,3);
if(die[aim]&&a[aim].rl==2&&a[x].rl==1) waste();
return ;
}
bool make_j(int x,int type)//当前x出的牌是否有效
{
int i=x;
while(1)
{
if(a[i].id==type&&a[i].num[7]){
ti[i]=1; mark[i]=0;
qp(i,7,1);
if(make_j(i,type^1)) return 0;
else return 1;
}
i=nex[i];
if(i==x) break;
}
return 1;
}
void make_f(int x,int aim)
{
qp(x,4,1);
ti[x]=1; mark[x]=0;
bool op=1;
if(ti[aim]&&!make_j(x,a[aim].id)) op^=1;
if(!op) return;
if(a[x].rl==1&&a[aim].rl==2)
{
tl[aim]--;
if(tl[aim]<=0) make_p(aim,0);
if(die[aim]) waste();
return ;
}
while(1)
{
if(!a[aim].num[2]){
tl[aim]--;
if(tl[aim]<=0) make_p(aim,0);
if(die[aim]&&a[aim].rl==3&&!die[x]) getp(x,3);
return ;
}
qp(aim,2,1);
if(!a[x].num[2]){
tl[x]--;
if(tl[x]<=0) make_p(x,0);
if(die[x]&&a[x].rl==3&&!die[aim]) getp(aim,3);
return ;
}
qp(x,2,1);
}
return ;
}
void make_n(int x)
{
qp(x,5,1);
for(int i=nex[x];i!=x;i=nex[i])
{
if(ti[i]&&!make_j(x,a[i].id)) continue;
if(a[i].num[2]) qp(i,2,1);
else{
tl[i]--;
if(a[i].rl==1) mark[x]=1;
if(tl[i]<=0) make_p(i,0);
if(die[i]&&a[i].rl==3) getp(x,3);
if(die[i]&&a[i].rl==2&&a[x].rl==1) waste();
}
}
}
void make_w(int x)
{
qp(x,6,1);
for(int i=nex[x];i!=x;i=nex[i])
{
if(ti[i]&&!make_j(x,a[i].id)) continue;
if(a[i].num[3]) qp(i,3,1);
else{
tl[i]--;
if(a[i].rl==1) mark[x]=1;
if(tl[i]<=0) make_p(i,0);
if(die[i]&&a[i].rl==3) getp(x,3);
if(die[i]&&a[i].rl==2&&a[x].rl==1) waste();
}
}
}
void make_z(int x)
{
qp(x,8,1); zb[x]=1;
}
void work(int x)
{
int t,aim,aim2;
bool op=0,op1=0;
getp(x,2);
while(1)
{
if(die[x]) return;
op1=0;
aim=getaim(x);
for(int i=a[x].he;i<a[x].tl;i++)
if(!a[x].v[i])
{
if(die[x]) return ;
t=a[x].q[i];
if(t==2&&a[x].rl==3)
{
if(a[nex[x]].id!=a[x].id&&ti[nex[x]]) aim=nex[x];
}
if(t==1&&tl[x]==4) continue;
if(t==3||t==7) continue;
if(t==2&&(nex[x]!=aim||(op&&!zb[x]))) continue;
if(t==4&&!aim) continue;
op1=1;
if(t==1) make_p(x,i);
if(t==2) make_k(x,aim),op=1;
if(t==4) make_f(x,aim);
if(t==5) make_n(x);
if(t==6) make_w(x);
if(t==8) make_z(x);
break;
}
if(die[x]) return ;
if(!op1) break;
while(a[x].v[a[x].he]) a[x].he++;
if(a[x].he>=a[x].tl) break;
}
return ;
}
int main()
{
char type[3]; int x;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%s",type);
tl[i]=4;
if(type[0]=='M'){ a[i].rl=1; pos_M=i; ti[i]=1; }
if(type[0]=='Z') a[i].rl=2;
if(type[0]=='F'){ a[i].rl=3; a[i].id=1; f_num++; }
for(int j=1;j<=4;j++)
{
scanf("%s",type);
x=getid(type[0]);
a[i].q[a[i].tl++]=x;
a[i].num[x]++;
}
}
for(int i=1;i<=m;i++)
{
scanf("%s",type);
s[m-i+1]=getid(type[0]);
}
top=m;
for(int i=1;i<=n;i++){
pre[i]=i-1; nex[i]=i+1;
}
nex[0]=1;
pre[1]=n; nex[n]=1;
for(int i=nex[0];i<=n;i=nex[i]) work(i);
return 0;
}