大模拟 猪国杀 杀蚂蚁
杀蚂蚁
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;
}

浙公网安备 33010602011771号