标签:
模拟。认真读题,理清思路。
#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);
}
}
}
标签:
原文地址:http://www.cnblogs.com/f321dd/p/5495969.html