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

猜你喜欢

转载自blog.csdn.net/y752742355/article/details/80524786