大模拟 猪国杀 杀蚂蚁
来源:互联网 发布:linux 管理员权限 编辑:程序博客网 时间:2024/04/30 11:10
杀蚂蚁
1.所有炮台是一起选择目标,选完之后一起打
2.如果蚂蚁这一秒没有移动位置,仍然要判断它是否会抗蛋糕,因为上一秒抗蛋糕的可能死了
3.蚂蚁的半径是0.5
4.只有洞口没有蚂蚁时新蚂蚁才会出来
链表存蚂蚁比较方便
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define maxn 400005using 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 2001using 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;}
阅读全文
1 0
- 大模拟 猪国杀 杀蚂蚁
- [BZOJ1033][ZJOI2008]杀蚂蚁antbuster(大模拟)
- 模拟 [ZJOI2008]杀蚂蚁antbuster
- 蚂蚁--模拟
- 【BZOJ1033】[ZJOI2008]杀蚂蚁antbuster【模拟】
- 【BZOJ1033】[ZJOI2008]杀蚂蚁antbuster【模拟】
- BZOJ 1033 [ZJOI2008]杀蚂蚁antbuster 模拟
- uva10881(蚂蚁模拟)
- 兰顿蚂蚁(模拟)
- 【普及模拟】蚂蚁
- 【模拟】【计算几何】[ZJOI2008][HYSBZ/BZOJ1033]杀蚂蚁antbuster
- 蚂蚁咬大青虫
- HPU1289 兰顿蚂蚁 【模拟】
- 蓝桥杯 蚂蚁感冒 不要模拟!
- 模拟-兰顿蚂蚁-水
- NYOJ 990 蚂蚁感冒(模拟)
- jzoj P1508【普及模拟】蚂蚁
- 蓝桥杯-兰顿蚂蚁 (模拟)
- mysql ERROR 1045 (28000): 错误解决办法
- mysql登录时,ERROR 1045 (28000): 错误解决办法
- [spring boot][thymeleaf]因html中没有结束标签而经常报异常-解决方案
- java多态性深入分析(静态动态绑定)
- 【Leetcode】【python】Minimum Path Sum
- 大模拟 猪国杀 杀蚂蚁
- 关于UITableView的分割线
- [I.MX6Q][Android6.0.1_r3]之源码获取及编译
- 麻将
- java二维数组初始化和基本操作
- 【Leetcode】【python】Valid Number
- 我的产品观
- [分块 回文自动机] LOJ#6070. 「2017 山东一轮集训 Day4」基因
- 我的技术观