模拟。认真读题,理清思路。
#include<cstdio> #include<list> #include<cstdlib> const int N=10; #define FOR(a,k)for(A k=P[a].begin();k!=P[a].end();++k) using namespace std; int n,m; int HP[N],ST[N]; bool ID[N],Z[N]; list<char> P[N]; typedef list<char>::iterator A; char q[2005]; void draw(int a,int v){ static int s; while(v--) P[a].push_back( q[q[s+1]?s++:s]); } void discard(int a,A& k){ P[a].erase(k++); } int next(int a){ for(++a%=n;!HP[a];++a%=n); return a; } bool check(){ for(int i=0;i!=n;++i) if(ID[i]&&HP[i]) return 0; return 1; } void output(bool p){ puts(p?"FP":"MP"); for(int i=0;i!=n;++i) if(!HP[i]) puts("DEAD"); else{ int s=0; FOR(i,k){ q[s++]=*k; q[s++]=32; } q[s?s-1:s]=0; puts(q); } exit(0); } void end(int a,A& k,bool p){ discard(a,k); output(p); } bool find(int a,char v){ FOR(a,k) if(*k==v){ discard(a,k); return 1; } return 0; } void kill(int a,int b,A& k){ if(!--HP[b]) if(find(b,‘P‘)) ++HP[b]; else if(check()) end(a,k,0); else if(!b) end(a,k,1); else if(ID[b]) draw(a,3); else if(!a){ P[a].clear(); P[a].push_front(Z[a]=0); k=P[a].begin(); } } void fight(int a,int b,A& k){ if(!a&&!ID[b]){ kill(a,b,k); return; } int t[]={a,b}; bool v=1; A s[]={ P[a].begin(), P[b].begin() }; A* i=s+v; while(*i!=P[t[v]].end()) if(**i!=‘K‘) ++*i; else{ discard(t[v],*i); i=s+(v^=1); } kill(t[v^1],t[v],k); } bool query(int a,int b){ if(ST[b]<0||ST[b]>1) return 0; int i=a; bool v=0,res=0; do if(ID[i]==(ST[b] ^v)&&find(i,‘J‘)){ ST[i]=ID[i]; a=b=i; v|=1; res^=1; } while((i=next(i))!=a); return res; } void attack(int a,int b,A& k){ if(*k==‘K‘&&!find(b,‘D‘)) kill(a,b,k); if(*k==‘F‘&&!query(a,b)) fight(a,b,k); if(!(ST[b]<0||ST[b]>1)) ST[a]=ST[b]^1; } char scan(){ char s[3]; scanf("%s",s); return *s; } int main(){ scanf("%d%d",&n,&m); for(int i=0;i!=n;++i){ HP[i]=4; ST[i]=-1; if(scan()==‘F‘) ID[i]=1; for(int j=0;j!=4;++j) P[i].push_back(scan()); } ST[0]=0; for(int i=0;i!=m;++i) q[i]=scan(); if(check()) output(0); for(int i=0;;i=next(i)){ draw(i,2); bool v=0; while(HP[i]){ A k=P[i].begin(); int a=next(i),b=a; if(ID[i]){ if(ST[a]) a=i; b=0; }else if(i){ if(ST[a]!=1) a=i; while(b!=i&&ST[b]!=1) b=next(b); }else{ if(ST[a]<1) a=i; while(b!=i&&ST[b]<1) b=next(b); } while(k!=P[i].end() &&(*k==‘D‘||*k==‘J‘ ||*k==‘P‘&&HP[i]==4 ||*k==‘K‘&&(a==i||v&&!Z[i]) ||*k==‘F‘&&b==i)) ++k; if(k==P[i].end()) break; if(*k==‘P‘) ++HP[i]; if(*k==‘K‘&&(!v++||Z[i])) attack(i,a,k); if(*k==‘F‘) attack(i,b,k); if(*k==‘N‘||*k==‘W‘){ int j=i; while((j=next(j))!=i) if(!query(i,j) &&!find(j,*k==‘N‘?‘K‘:‘D‘)){ kill(i,j,k); !j&&!~ST[i]?ST[i]=2:0; } } if(*k==‘Z‘) Z[i]=1; discard(i,k); } } }
时间: 2024-12-19 13:01:20