• 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
    ");
    	   }
    	 else
    	 {
    	 	for (int j=1;j<=a[i].tot;j++)
    	 	{
    	 		if (a[i].a[j]!='*')
    	 		cout<<a[i].a[j]<<" ";
    		 }
    		 cout<<"
    ";
    	 }
      }
    }
    
    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
    ");
    	   }
    	 else
    	 {
    	 	for (int j=1;j<=a[i].tot;j++)
    	 	{
    	 		if (a[i].a[j]!='*')
    	 		cout<<a[i].a[j]<<" ";
    		 }
    		 cout<<"
    ";
    	 }
      }
      return 0;
    }
    
    
  • 相关阅读:
    C#操作符??和?:
    使用Windows8开发Metro风格应用一
    使用Windows8开发Metro风格应用二
    Win8使用技巧
    详解 xls xlst xml 一
    SqlDataAdapter DataSet DataTable 详解
    DataSet 与 xml
    FileTracker : error FTK1011编译错误
    我的CHROME插件
    Komodo升级错误
  • 原文地址:https://www.cnblogs.com/yimmortal/p/10160767.html
Copyright © 2020-2023  润新知