码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj1972: [Sdoi2010]猪国杀 模拟

时间:2016-05-15 21:32:19      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:

模拟。认真读题,理清思路。

#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);
		}
	}
}

  

bzoj1972: [Sdoi2010]猪国杀 模拟

标签:

原文地址:http://www.cnblogs.com/f321dd/p/5495969.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!