bzoj1972 SDOI2010-----猪国杀(模拟)

题目自己去找吧
记得数据范围是<=10

注意事项:
1.牌库空的时候,要不断的抽第一张牌
2.反贼的决斗永远是向主公发的
3.每次判定无懈的时候,都是从使用锦囊的那个牌开始,记得敌意和殷勤的判断
4.只能向有身份的人无懈可击
5.有装备就装

#include<iostre am>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#include<vector>

using namespace std;

inline int read()
{
   int x=0,f=1;char ch=getchar();
   while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
   while (isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
   return x*f;
}

struct pig{
	char a[100000];
	int tot;
	int blood;
	int num;
	int nxt;
	int shan;
	int sha;
	int tao;
	int wu;
	int pre;
	int biao;//0 啥也没有 1类反 2表反 3表忠 
	int shenfen;//1主公,2忠臣,3反贼 
	int nanman,wanjian,zhuge,jd;
	bool dead;
	bool weapon;
	int atk;
};

pig a[15];
int n,m;
char paiku[2010];
int top;
int fanzei;
int start;

void clear(int now,char p,int num)
{
	for (int i=1;i<=a[now].tot;i++)
	{
		if (!num) break;
		if (a[now].a[i]==p) num--,a[now].a[i]='*';
	}
}

int judge()
{
	int fz=0;
	for (int i=1;i<=n;i++)
	{
		if (a[i].dead && a[i].shenfen==3) fz++;
		if (a[i].dead && a[i].shenfen==1) return 1;
	}
	if (fz==fanzei) return 2;
	else return 0;
}


void biaoyinqin(int now,int to)
{
	if (now==to) return;
	if (a[now].shenfen!=1)
	{	
	  if (a[to].shenfen==1) a[now].biao=3;
	  else
	  {
        if (a[to].shenfen==1) a[now].biao=3;
	    if (a[to].biao==2) a[now].biao=2;
	    if (a[to].biao==3) a[now].biao=3;
	  } 
    }
}

void biaodiyi(int now,int to)
{
	if (now==to) return;
	if (a[now].shenfen!=1)
	{	
	  if (a[to].shenfen==1) a[now].biao=2;
	  else
	  {
	    if (a[to].biao==2) a[now].biao=3;
	    if (a[to].biao==3) a[now].biao=2;
	  } 
    }
}

void mopai(int num,int tot)
{
	while (tot>0)
	{
		a[num].a[++a[num].tot]=paiku[top];
		if (paiku[top]=='P') a[num].tao++;
		if (paiku[top]=='K') a[num].sha++;
		if (paiku[top]=='D') a[num].shan++;
		if (paiku[top]=='J') a[num].wu++;
		if (paiku[top]=='F') a[num].jd++;
		if (paiku[top]=='N') a[num].nanman++;
		if (paiku[top]=='W') a[num].wanjian++;
		if (paiku[top]=='Z') a[num].zhuge++;
		top=max(top-1,1);
		tot--;
	}
}

bool peach(int now,int to)
{
	if (a[now].tao>0 && a[to].blood<4)
	{
	  a[to].blood++;
	  a[now].tao--;
	  clear(now,'P',1);
	  return true;
    }
    return false;
}

void death(int now,int to)
{
	a[to].dead=true;
	if (judge()) return;
    a[a[to].pre].nxt=a[to].nxt;
    a[a[to].nxt].pre=a[to].pre;
	if (a[now].shenfen==1 && a[to].shenfen==2)
	{
		a[now].weapon=false;
		for (int i=1;i<=a[now].tot;i++) a[now].a[i]='*';
		a[now].sha=a[now].shan=a[now].wu=a[now].tao=a[now].nanman=a[now].wanjian=a[now].jd=a[now].zhuge=0;
	}
	else
	{
		if (a[to].shenfen==3) mopai(now,3);
	}
	a[to].weapon=false;
	for (int i=1;i<=a[to].tot;i++) a[to].a[i]='*';
	a[to].sha=a[to].shan=a[to].wu=a[to].tao=a[to].nanman=a[to].wanjian=a[to].jd=a[to].zhuge=0;
	a[to].dead=true;
}

void damage(int now,int to)
{
	a[to].blood--; 
	if (a[to].blood!=0) return;
	if (!peach(to,to)) 
	{
	  if (judge()) return;
	  death(now,to);
    }
}

void sha(int now,int to)
{
	biaodiyi(now,to);
	a[now].sha--;
	clear(now,'K',1);
	if (a[to].shan==0) damage(now,to);
	else 
		a[to].shan--,clear(to,'D',1);
}

bool gg(int now)
{
	bool flag=false;
	if ((a[now].biao==0 || a[now].biao==1 ) && a[now].shenfen!=1) return false;
	int pos = a[now].nxt;
	if (!flag)
	{
	while (pos!=now)
		{
			if (a[pos].wu>0 && ((a[now].shenfen==1 && a[pos].shenfen==3) ||(a[now].biao==3 && a[pos].shenfen==3)|| (a[now].biao==2 && a[pos].shenfen==2)|| (a[now].biao==2 && a[pos].shenfen==1)))
	        {
		     flag=true;
		     a[pos].wu--;
		     clear(pos,'J',1);
		     biaodiyi(pos,now);
		     break;
	        }
	        pos=a[pos].nxt;
		}
    }
	if (flag) return !gg(pos);
	return false;
}

bool wuxie(int now,int st) 
{
	bool flag=false;
	if ((a[now].biao==0 || a[now].biao==1 ) && a[now].shenfen!=1) return false;
	if (a[st].wu>0 && ((a[now].shenfen==1 && a[st].shenfen==2) ||(a[now].biao==2 && a[st].shenfen==3) || (a[now].biao==3 && a[st].shenfen==2) || (a[now].biao==3 && a[st].shenfen==1)||(a[now].shenfen==1 && a[st].shenfen==1)))
	{
		flag=true;
		a[st].wu--;
		biaoyinqin(st,now);
		clear(st,'J',1); 
	}
	int pos =st;
	if (!flag)
	{
	pos=a[st].nxt;
	while (pos!=st)
		{
			if (pos!=now)
			{
			if (a[pos].wu>0 && ((a[now].shenfen==1 && a[pos].shenfen==2) ||(a[now].biao==2 && a[pos].shenfen==3) || (a[now].biao==3 && a[pos].shenfen==2) || (a[now].biao==3 && a[pos].shenfen==1)))
	        {
		     flag=true;
		     a[pos].wu--;
		     clear(pos,'J',1);
		     biaoyinqin(pos,now);
		     break;
	        }
	        }
	        else
	        {
	        	if ((a[pos].biao!=0 && a[pos].biao!=1) || a[pos].shenfen==1)
	        	{
	        		if (a[pos].wu>0)
	        		{
	        			flag=true;
	        			a[pos].wu--;
	        			clear(pos,'J',1);
	        			break;
					}
				}
			}
	        pos=a[pos].nxt;
		}
	}
	if (flag) return !gg(pos);
	return false;
}

void juedou(int now,int to)
{
	biaodiyi(now,to);
	a[now].jd--;
	clear(now,'F',1);
	if (a[now].shenfen==1 && a[to].shenfen==2)
	{
		a[to].blood--;
	    if (a[to].blood!=0) return;
	    if (!peach(to,to)) a[to].dead=true,death(now,to);
	}
	else
	{
	  if (!wuxie(to,now))
	  {
		int min1=min(a[now].sha,a[to].sha);
		a[now].sha-=min1;a[to].sha-=min1;
		clear(now,'K',min1);
		clear(to,'K',min1);
		if (a[to].sha==0)
		{ 
		  damage(now,to);
	    }
	    else
	    {
	      a[to].sha--;
	      clear(to,'K',1);
	      damage(to,now);
		}
	  }  
    }
}

void nanmanruqin(int now)
{
	a[now].nanman--;
	clear(now,'N',1);
	int pos = a[now].nxt;
    while (pos!=now)
    {
    	if (!wuxie(pos,now))
    	{
    		if (a[pos].sha>0) 
			{
			  a[pos].sha--,clear(pos,'K',1);
		    }
    		else 
    		{
    			damage(now,pos);
    			if (a[pos].shenfen==1 && !a[now].biao) a[now].biao=1;
			}
		}
		if (judge()) return;	  
		pos=a[pos].nxt;
	}
}

void wanjianqifa(int now)
{
	a[now].wanjian--;
	clear(now,'W',1);
	int pos = a[now].nxt;
    while (pos!=now)
    {
    	if (!wuxie(pos,now))
    	{
    		if (a[pos].shan>0) 
			  a[pos].shan--,clear(pos,'D',1);
    		else 
    		{
    			damage(now,pos);
    			if (a[pos].shenfen==1 && !a[now].biao) a[now].biao=1;
			}
		}
	  if (judge()) return; 
	  pos=a[pos].nxt;
	}	
}

int find(int now)
{
	int pos = a[now].nxt;
	while (a[pos].biao!=1 && a[pos].biao!=2 && pos!=now)
	{
		pos=a[pos].nxt;
	}
	if (pos==now) return 0;
	else return pos;
}

int find1(int now)
{
	int pos = a[now].nxt;
	while (a[pos].biao!=2 && pos!=now)
	{
		pos=a[pos].nxt;
	}
	if (pos==now) return 0;
	else return pos;
}

void print()
{
	if (judge()==1)
  {
  	cout<<"FP"<<endl;
  }
  else
    cout<<"MP"<<endl;
  for (int i=1;i<=n;i++)
  {
  	 if (a[i].dead)
  	 {
  	 	printf("DEAD\n");
	   }
	 else
	 {
	 	for (int j=1;j<=a[i].tot;j++)
	 	{
	 		if (a[i].a[j]!='*')
	 		cout<<a[i].a[j]<<" ";
		 }
		 cout<<"\n";
	 }
  }
}

int main()
{
  scanf("%d%d",&n,&m);
  for (int i=1;i<=n;i++)
  {
  	  a[i].blood=4;
  	 char s[10];
  	 scanf("%s",s+1);
  	 if (s[1]=='M') a[i].shenfen=1,start=i;
  	 if (s[1]=='Z') a[i].shenfen=2;
  	 if (s[1]=='F') a[i].shenfen=3,fanzei++;
  	 for (int j=1;j<=4;j++)
  	 {
  	 	scanf("%s",s+1);
  	 	if (s[1]=='P') a[i].tao++;
		if (s[1]=='K') a[i].sha++;
		if (s[1]=='D') a[i].shan++;
		if (s[1]=='J') a[i].wu++;
		if (s[1]=='F') a[i].jd++;
		if (s[1]=='N') a[i].nanman++;
		if (s[1]=='W') a[i].wanjian++;
		if (s[1]=='Z') a[i].zhuge++;
		a[i].a[j]=s[1];
		a[i].tot++;
	 }
  }
  top=m;
  for (int i=1;i<=m;i++)
  {
     char s[10];
     scanf("%s",s+1);
  	 paiku[m-i+1]=s[1];
  }
  for (int i=1;i<=n-1;i++) a[i].nxt=i+1;
  a[n].nxt=1;
  for (int i=2;i<=n;i++) a[i].pre=i-1;
  a[1].pre=n; 
  int now = 1;
  while (!judge())
  {
  	 mopai(now,2);
  	 bool flag=false;
  	 for (int i=1;i<=a[now].tot;i++)
  	 {
  	 	if (a[now].dead) break;
  	 	int mubiao=0;
  	 	if (a[now].shenfen==1)
  	 	{
  	 		mubiao=find(now);
		}
		if (a[now].shenfen==2)
		{
			mubiao=find1(now);
		}
  	 	if (a[now].a[i]!='*')
  	 	{
  	 	    if (a[now].a[i]=='K')
  	 	    {
			   if ((a[now].weapon) || (!flag)) 
			   {
  	 				  if ((a[now].shenfen==1 && a[a[now].nxt].biao==1) || (a[now].shenfen==1 && a[a[now].nxt].biao==2) || (a[now].shenfen==2 && a[a[now].nxt].biao==2) ||(a[now].shenfen==3 && a[a[now].nxt].shenfen==1) || (a[now].shenfen==3 && a[a[now].nxt].biao==3))
						{
						if (a[now].sha) 
						{
						  sha(now,a[now].nxt);
						  if (judge()) 
						  {
						  	 print();
						  	 return 0;
					      }
						  i=0;
						  flag=true;
						}
					   }
				   }
			   }
			  if (a[now].a[i]=='P')
			  {
				    if (a[now].blood<4) peach(now,now),i=0;
			   }
			   if (a[now].a[i]=='F')			   
			   {
					if (a[now].shenfen==1) {
						if (mubiao) 
						{
						  juedou(now,mubiao);
						  i=0;
					     }
					}
					if (a[now].shenfen==2) {
						if (mubiao) 
						{
						  juedou(now,mubiao);
						  i=0;
					    }
					}
					if (a[now].shenfen==3) {
					  juedou(now,start),i=0;
					}
					if (judge()) 
						  {
						  	 print();
						  	 return 0;
					      }
			    }
		    	if (a[now].a[i]=='N')
				{
				  nanmanruqin(now),i=0;
				  if (judge()) 
						  {
						  	 print();
						  	 return 0;
					      }
			     }
				if (a[now].a[i]=='W')
				{
				  wanjianqifa(now),i=0;
				  if (judge()) 
						  {
						  	 print();
						  	 return 0;
					      }
			    }
			  if (a[now].a[i]=='Z')
				{
				  a[now].weapon=true,a[now].a[i]='*',i=0;
				  a[now].zhuge--;
				  if (judge()) 
						  {
						  	 print();
						  	 return 0;
					  }
			    }
			}
	  }
	 now = a[now].nxt; 
  }
  if (judge()==1)
  {
  	cout<<"FP"<<endl;
  }
  else
    cout<<"MP"<<endl;
  for (int i=1;i<=n;i++)
  {
  	 if (a[i].dead)
  	 {
  	 	printf("DEAD\n");
	   }
	 else
	 {
	 	for (int j=1;j<=a[i].tot;j++)
	 	{
	 		if (a[i].a[j]!='*')
	 		cout<<a[i].a[j]<<" ";
		 }
		 cout<<"\n";
	 }
  }
  return 0;
}

posted @ 2018-12-22 13:19  y_immortal  阅读(143)  评论(0编辑  收藏  举报