• BZOJ1972: [Sdoi2010]猪国杀 (模拟)


    终结这道题也是很长时间的梦想了吧,祝自己NOIP2018rp++。

    传送门:

    解题思路:

    模拟没什么好说的,这里主要提几个坑点。

    第一个:桃的使用,在判定血量后在函数中单独使用。

    第二个:索引不要搞乱。

    第三个:每次都要重新枚举手牌(从左向右)

    第四个:对于无懈可击,递归求解,我比较喜欢新建经典反猪和经典忠猪,划分阵营来搞。主要是一个递归函数,返回bool形变量,表示无懈是否成功。

    第五个:这个是题目的错误,当牌堆空了时,直接重复摸最后一张。

    这里有几个小技巧。

    1.函数先声明再定义,有利于理清思路,调试时也比较方便。

    2.对场景和角色分别定义函数。

    3.划阵营来判断做法,最好有两种状态:自己的和表现的。这样也不用担心忠猪跳反或反猪跳忠了。

    最后是代码:

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<algorithm>
      4 struct Pig{
      5     /*身份*/
      6     bool Mp;
      7     bool Zp;
      8     bool Ap;
      9     /*外部显示*/
     10     bool aM;
     11     bool aZ;
     12     bool aA;
     13     bool LA;
     14     bool Apd;//表明身份
     15     bool Wep;
     16     int lst;
     17     int nxt;
     18     /*个人信息-全局*/
     19     bool dead;
     20     int Hp;
     21     int nk;
     22     int num;
     23     int card[10000];
     24     bool usd[10000];
     25     /*个人信息-回合*/
     26     int nmk;//当局使用杀的个数 
     27     bool eat_peach(void);
     28     bool use_kill(void);
     29     bool use_dodge(void);
     30     bool use_nxkj(void);
     31     void Profile(char *a);
     32     void Insert(int x);
     33     void New(void);
     34     void print(void);
     35     void Drw(void);
     36     void arm(void);
     37     void clear(void);
     38     void pro(void);
     39 }p[100];
     40 /*动态统计*/
     41 int sta;
     42 int numA;
     43 int Apa;
     44 bool Game_is_going_on; 
     45 /*全局信息*/
     46 int n,m;
     47 int top;
     48 char opt[10];
     49 int hep[100000];
     50 bool Rlts(int usr_a,int U);
     51 bool Nxkj(int user,int chr);
     52 bool Can_duel(int user);
     53 bool Can_use_kill(int user);
     54 int trans(char *a);
     55 int Pick(int user);
     56 int Enyd(int user);
     57 int anti(int user);
     58 void Act(int user);
     59 void Die(int user,int killer);
     60 void Cur(int user,int killer,int dlt);
     61 void Use(int user,int type);
     62 void Use_kill(int user);
     63 void Use_duel(int user);
     64 void Use_Sprq(int user);
     65 void Use_Ttaf(int user);
     66 void Peach_use_prol(int user);
     67 void Apear(int user);
     68 void Game_end(void);
     69 void print_it(int x);
     70 void check(void);
     71 int main()
     72 {
     73 //    freopen("20.in","r",stdin);
     74     Game_is_going_on=true;
     75     sta=1;
     76     scanf("%d%d",&n,&m);
     77     for(int i=1;i<=n;i++)
     78     {
     79         scanf("%s",opt+1);
     80         p[i].Profile(opt);
     81         for(int j=1;j<=4;j++)
     82         {
     83             scanf("%s",opt+1);
     84             p[i].Insert(trans(opt));
     85         }
     86         p[i].nxt=i+1;
     87         p[i].lst=i-1;
     88     }
     89     p[1].lst=n;
     90     p[n].nxt=1;
     91     p[80].Apd=true;
     92     p[80].aZ=true;
     93     p[80].Zp=true;
     94     p[81].Apd=true;
     95     p[81].aA=true;
     96     p[81].Ap=true;
     97     top=m;
     98     for(int i=1;i<=m;i++)
     99     {
    100         scanf("%s",opt+1);
    101         hep[m-i+1]=trans(opt);
    102     }
    103     while(Game_is_going_on)
    104         Act(sta);
    105     Game_end();
    106     return 0;
    107 }
    108 /*
    109     桃(P):1
    110     在自己的回合内,如果自己的体力值不等于体力上限,
    111     那么使用一个桃可以为自己补充一点体力,否则不能使用桃;
    112     桃只能对自己使用;在自己的回合外,如果自己的血变为0或者更低,那么也可以使用;
    113     杀(K):2
    114     在自己的回合内,对攻击范围内除自己以外的一名角色使用。
    115     如果没有被『闪』抵消,则造成1点伤害。无论有无武器,杀的攻击范围都是1;
    116     闪(D):3
    117     当你受到杀的攻击时,可以弃置一张闪来抵消杀的效果;
    118     锦囊: 
    119     决斗(F):4
    120     出牌阶段,对除自己以外任意一名角色使用,由目标角色先开始,
    121     自己和目标角色轮流弃置一张杀,首先没有杀可弃的一方受到1点伤害,另一方视为此伤害的来源;
    122     南猪入侵(N):5
    123     出牌阶段,对除你以外所有角色使用,按逆时针顺序从使用者下家开始依次结算,
    124     除非弃置一张杀,否则受到1点伤害;
    125     万箭齐发(W):6
    126     和南猪入侵类似,不过要弃置的不是杀而是闪;
    127     无懈可击(J):7
    128     在目标锦囊生效前抵消其效果。每次有一张锦囊即将生效时,从使用这张锦囊的猪开始,
    129     按照逆时针顺序,依次得到使用无懈可击的机会;
    130     效果:用于决斗时,决斗无效并弃置;用于南猪入侵或万箭齐发时,当结算到某个角色时
    131     才能使用,当前角色不需弃置牌并且不会受到伤害(仅对一个角色产生效果);用于无
    132     懈可击时,成为目标的无懈可击被无效。
    133     猪哥连弩(Z):8
    134     武器,攻击范围1,出牌阶段你可以使用任意张杀;
    135     同一时刻最多只能装一个武器;如果先前已经有了一把武器,那么之后再装武器的话,
    136     会弃置以前的武器来装现在的武器;
    137 */
    138 int trans(char *a)
    139 {
    140     if(a[1]=='P')
    141         return 1;//
    142     if(a[1]=='K')
    143         return 2;//
    144     if(a[1]=='D')
    145         return 3;//
    146     if(a[1]=='F')
    147         return 4;//决斗
    148     if(a[1]=='N')
    149         return 5;//南猪入侵
    150     if(a[1]=='W')
    151         return 6;//万箭齐发
    152     if(a[1]=='J')
    153         return 7;//无懈可击
    154     if(a[1]=='Z')
    155         return 8;//猪哥连弩 
    156 }
    157 void Act(int user)
    158 {
    159     check();
    160 //    p[user].pro();
    161 //    printf(":");
    162     if(!Game_is_going_on)
    163         return ;
    164     p[user].New();
    165     p[user].Drw();
    166     p[user].Drw();
    167     int c=Pick(user);
    168 //    if(c)
    169 //        p[user].print();
    170     while(c)
    171     {
    172 //        p[user].pro();
    173 //        printf("Hp: %d card: ",p[user].Hp);
    174 //        print_it(c);
    175 //        puts("");
    176         Use(user,c);
    177 //        p[user].print();
    178         if(p[user].dead)
    179             break;
    180         c=Pick(user);
    181     }
    182 //    p[user].print();
    183     do{
    184         sta=p[sta].nxt;
    185     }while(p[sta].dead);
    186     return ;
    187 }
    188 int Pick(int user)
    189 {
    190     bool *u=p[user].usd;
    191     int *c=p[user].card;
    192     for(int i=1;i<=p[user].num;i++)
    193     {
    194         if(u[i]||c[i]==3||c[i]==7)
    195             continue;
    196         if(c[i]==1)
    197         {
    198             Peach_use_prol(user);
    199             continue;
    200         }
    201         if(c[i]==8)
    202         {
    203             p[user].arm();
    204             u[i]=true;
    205             i=0;
    206             continue;
    207         }
    208         if((c[i]==2&&Can_use_kill(user))||(c[i]==4&&Can_duel(user))||(c[i]==5)||(c[i]==6))
    209         {
    210             u[i]=true;
    211             return c[i];
    212         }
    213     }
    214     return 0;
    215 }
    216 void Use(int user,int type)
    217 {
    218     if(type==2)
    219         Use_kill(user);
    220     if(type==4)
    221         Use_duel(user);
    222     if(type==5)
    223         Use_Sprq(user);
    224     if(type==6)
    225         Use_Ttaf(user);
    226     return ;
    227 }
    228 void Peach_use_prol(int user)
    229 {
    230     if(p[user].Hp==4)
    231         return ;
    232     p[user].eat_peach();
    233     return ;
    234 }
    235 bool Can_use_kill(int user)
    236 {
    237     int enemy=p[user].nxt;
    238     if(p[user].nmk>=1&&!p[user].Wep)
    239         return false;
    240     if(p[user].Mp)
    241         if((p[enemy].Apd&&p[enemy].aA)||p[enemy].LA)
    242         {
    243             p[user].nmk++;
    244             return true;
    245         }
    246     if(!p[enemy].Apd)
    247         return false;
    248     if((p[enemy].aZ&&p[user].Ap)||(p[enemy].aA&&p[user].Zp)||(p[enemy].Mp&&p[user].Ap))
    249     {
    250         p[user].nmk++;
    251         return true;
    252     }
    253     return false;
    254 }
    255 bool Can_duel(int user)
    256 {
    257     if(p[user].Ap)
    258         return true;
    259     if(p[user].Zp)
    260         for(int i=p[user].nxt;i!=user;i=p[i].nxt)
    261             if(p[i].aA)
    262                 return true;
    263     if(p[user].Mp)
    264         for(int i=p[user].nxt;i!=user;i=p[i].nxt)
    265             if(p[i].LA||p[i].aA)
    266                 return true;
    267     return false;
    268 }
    269 void check(void)
    270 {
    271     if(p[1].Hp<=0||!numA)
    272         Game_is_going_on=false;
    273     return ;
    274 }
    275 void Use_kill(int user)
    276 {
    277     int enemy=p[user].nxt;
    278     Apear(user);
    279     if(p[enemy].use_dodge())
    280         return ;
    281     Cur(enemy,user,1);
    282     return ;
    283 }
    284 void Use_duel(int user)
    285 {
    286     int enemy=Enyd(user);
    287 //    printf("Fight
            Pig_a: %d Pig_b: %d
    ",user,enemy);
    288     if(user==1&&p[enemy].LA&&!p[enemy].Apd)
    289     {
    290         Cur(enemy,user,1);
    291         return ;
    292     }
    293     Apear(user);
    294     if(Nxkj(user,enemy))
    295         return ;
    296     while(p[enemy].use_kill())
    297         std::swap(user,enemy);
    298 //    printf("lose life: ");
    299 //    p[enemy].pro();
    300 //    puts("");
    301     Cur(enemy,user,1);
    302     return ;
    303 }
    304 void Use_Sprq(int user)
    305 {
    306     for(int i=p[user].nxt;i!=user;i=p[i].nxt)
    307     {
    308         if(Nxkj(user,i))
    309             continue;
    310         if(p[i].use_kill())
    311             continue;
    312 //        printf("lose life: ");
    313 //        p[i].pro();
    314 //        puts("");
    315         Cur(i,user,1);
    316         if(i==1&&!p[user].Apd)
    317             p[user].LA=true;
    318     }
    319     return ;
    320 }
    321 void Use_Ttaf(int user)
    322 {
    323     for(int i=p[user].nxt;i!=user;i=p[i].nxt)
    324     {
    325         if(Nxkj(user,i))
    326             continue;
    327         if(p[i].use_dodge())
    328             continue;
    329 //        printf("lose life: ");
    330 //        p[i].pro();
    331 //        puts("");
    332         Cur(i,user,1);
    333         if(i==1&&!p[user].Apd)
    334             p[user].LA=true;
    335     }
    336     return ;
    337 }
    338 void Apear(int user)
    339 {
    340     p[user].aM=p[user].Mp;
    341     p[user].aZ=p[user].Zp;
    342     p[user].aA=p[user].Ap;
    343     p[user].LA=false;
    344     p[user].Apd=true;
    345     return ;
    346 }
    347 void Cur(int user,int killer,int dlt)
    348 {
    349     p[user].Hp--;
    350     if(p[user].Hp>0)
    351         return ;
    352     while(p[user].Hp<=0&&p[user].eat_peach());
    353     if(p[user].Hp<=0)
    354         Die(user,killer);
    355     return ;
    356 }
    357 int Enyd(int user)
    358 {
    359     if(p[user].Ap)
    360         return 1;
    361     for(int i=p[user].nxt;i!=user;i=p[i].nxt)
    362         if((p[i].Apd&&p[i].aA)||((!p[i].Apd)&&p[i].LA&&p[user].Mp))
    363             return i;
    364 }
    365 bool Nxkj(int user,int chr)
    366 {
    367     
    368     bool ansl;
    369     if(!p[chr].Apd)
    370         return false;
    371     int i=user;
    372     ansl=false;
    373     do{
    374         if(Rlts(i,chr)&&p[i].use_nxkj())
    375         {
    376             Apear(i);
    377             return !Nxkj(i,anti(chr));
    378         }
    379         i=p[i].nxt;
    380     }while(i!=user);
    381     return false;
    382 }
    383 bool Rlts(int usr_a,int U)
    384 {
    385     if(p[usr_a].Mp&&p[U].Mp)
    386         return true;
    387     if(p[usr_a].Zp&&p[U].aZ)
    388         return true;
    389     if(p[usr_a].Zp&&p[U].aM)
    390         return true;
    391     if(p[usr_a].Mp&&p[U].aZ)
    392         return true;
    393     if(p[usr_a].Ap&&p[U].aA)
    394         return true;
    395     return false;
    396 }
    397 void Die(int user,int killer)
    398 {
    399     p[user].dead=true;
    400     p[p[user].lst].nxt=p[user].nxt;
    401     p[p[user].nxt].lst=p[user].lst;
    402     if(p[user].Ap)
    403     {
    404         numA--;
    405         if(!numA)
    406             Game_end();
    407         for(int i=1;i<=3;i++)
    408             p[killer].Drw();
    409     }
    410     if(p[user].Mp)
    411         Game_end();
    412     if(p[user].Zp&&killer==1)
    413         p[1].clear();
    414     return ;
    415 }
    416 void Game_end(void)
    417 {
    418     if(!numA)
    419         puts("MP");
    420     else
    421         puts("FP");
    422     for(int i=1;i<=n;i++)
    423         p[i].print();
    424     exit(0);
    425 }
    426 int anti(int user)
    427 {
    428     if(p[user].Ap)
    429         return 80;
    430     return 81;
    431 }
    432 void print_it(int x)
    433 {
    434     if(x==1)
    435         printf("P ");
    436     if(x==2)
    437         printf("K ");
    438     if(x==3)
    439         printf("D ");
    440     if(x==4)
    441         printf("F ");
    442     if(x==5)
    443         printf("N ");
    444     if(x==6)
    445         printf("W ");
    446     if(x==7)
    447         printf("J ");
    448     if(x==8)
    449         printf("Z ");
    450 }
    451 void Pig::Profile(char *a)
    452 {
    453     Hp=4;
    454     if(a[1]=='M')
    455     {
    456         Mp=true;
    457         aM=true;
    458         Apd=true;
    459     }
    460     if(a[1]=='Z')
    461         Zp=true;
    462     if(a[1]=='F')
    463     {
    464         Ap=true;
    465         numA++;
    466     }
    467     return ;
    468 }
    469 void Pig::Insert(int x)
    470 {
    471     card[++num]=x;
    472     usd[num]=false;
    473     return ;
    474 }
    475 void Pig::New(void)
    476 {
    477     nmk=0;
    478     return ;
    479 }
    480 void Pig::Drw(void)
    481 {
    482     if(!top)
    483         top=1;
    484     Insert(hep[top--]);
    485     return ;
    486 }
    487 void Pig::arm(void)
    488 {
    489     Wep=true;
    490     return ;
    491 }
    492 bool Pig::eat_peach(void)
    493 {
    494     if(Hp==4)
    495         return false;
    496     for(int i=1;i<=num;i++)
    497         if(usd[i]==0&&card[i]==1)
    498         {
    499             if(Hp==4)
    500                 return false;
    501             usd[i]=true;
    502             Hp++;
    503             return true;
    504         }
    505     return false;
    506 }
    507 bool Pig::use_dodge(void)
    508 {
    509     for(int i=1;i<=num;i++)
    510         if(usd[i]==0&&card[i]==3)
    511         {
    512             usd[i]=true;
    513             return true;
    514         }
    515     return false;
    516 }
    517 bool Pig::use_kill(void)
    518 {
    519     for(int i=1;i<=num;i++)
    520         if(usd[i]==0&&card[i]==2)
    521         {
    522             usd[i]=true;
    523             return true;
    524         }
    525     return false;
    526 }
    527 bool Pig::use_nxkj(void)
    528 {
    529     for(int i=1;i<=num;i++)
    530         if(usd[i]==0&&card[i]==7)
    531         {
    532             usd[i]=true;
    533             return true;
    534         }
    535     return false;
    536 }
    537 void Pig::clear(void)
    538 {
    539     num=0;
    540     Wep=false;
    541     memset(card,0,sizeof(card));
    542     memset(usd,0,sizeof(usd));
    543     return ;
    544 }
    545 void Pig::print(void)
    546 {
    547     if(dead)
    548         printf("DEAD");
    549     else
    550         for(int i=1;i<=num;i++)
    551             if(!usd[i])
    552                 print_it(card[i]);
    553     printf("
    ");
    554     return ;
    555 }
    556 void Pig::pro(void)
    557 {
    558     if(Mp)
    559         printf("Mp ");
    560     if(Zp)
    561         printf("Zp ");
    562     if(Ap)
    563         printf("Ap ");
    564     return ;
    565 }

    压行以后:

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<algorithm>
      4 struct Pig{
      5     /*身份*/
      6     bool Mp,Zp,Ap,aM,aZ,aA,LA,Apd,Wep,dead,usd[10000];;
      7     int lst,nxt,Hp,nk,num,nmk,card[10000];
      8     bool eat_peach(void);
      9     bool use_kill(void);
     10     bool use_dodge(void);
     11     bool use_nxkj(void);
     12     void Profile(char *a);
     13     void Insert(int x);
     14     void New(void);
     15     void print(void);
     16     void Drw(void);
     17     void arm(void);
     18     void clear(void);
     19     void pro(void);
     20 }p[100];
     21 /*动态统计*/
     22 int sta,numA,Apa,n,m,top,hep[100000];
     23 bool Game_is_going_on; 
     24 char opt[10];
     25 bool Rlts(int usr_a,int U);
     26 bool Nxkj(int user,int chr);
     27 bool Can_duel(int user);
     28 bool Can_use_kill(int user);
     29 int trans(char *a);
     30 int Pick(int user);
     31 int Enyd(int user);
     32 int anti(int user);
     33 void Act(int user);
     34 void Die(int user,int killer);
     35 void Cur(int user,int killer,int dlt);
     36 void Use(int user,int type);
     37 void Use_kill(int user);
     38 void Use_duel(int user);
     39 void Use_Sprq(int user);
     40 void Use_Ttaf(int user);
     41 void Peach_use_prol(int user);
     42 void Apear(int user);
     43 void Game_end(void);
     44 void print_it(int x);
     45 void check(void);
     46 int main()
     47 {
     48     Game_is_going_on=true;sta=1;
     49     scanf("%d%d",&n,&m);
     50     for(int i=1;i<=n;i++)
     51     {
     52         scanf("%s",opt+1);p[i].Profile(opt);
     53         for(int j=1;j<=4;j++){scanf("%s",opt+1);p[i].Insert(trans(opt));}
     54         p[i].nxt=i+1,p[i].lst=i-1;
     55     }
     56     p[1].lst=n;p[n].nxt=1;p[80].Apd=true;p[80].aZ=true;p[80].Zp=true;p[81].Apd=true;p[81].aA=true;p[81].Ap=true;top=m;
     57     for(int i=1;i<=m;i++){scanf("%s",opt+1);hep[m-i+1]=trans(opt);}
     58     while(Game_is_going_on)Act(sta);Game_end();
     59     return 0;
     60 }
     61 int trans(char *a){if(a[1]=='P')return 1;if(a[1]=='K')return 2;if(a[1]=='D')return 3;if(a[1]=='F')return 4;if(a[1]=='N')return 5;if(a[1]=='W')return 6;if(a[1]=='J')return 7;if(a[1]=='Z')return 8; }
     62 void Act(int user)
     63 {
     64     check();
     65     if(!Game_is_going_on)return ;
     66     p[user].New();p[user].Drw();p[user].Drw();
     67     int c=Pick(user);
     68     while(c){Use(user,c);if(p[user].dead)break;c=Pick(user);}
     69     do{sta=p[sta].nxt;}while(p[sta].dead);
     70 }
     71 int Pick(int user)
     72 {
     73     bool *u=p[user].usd;
     74     int *c=p[user].card;
     75     for(int i=1;i<=p[user].num;i++)
     76     {
     77         if(u[i]||c[i]==3||c[i]==7)continue;
     78         if(c[i]==1){Peach_use_prol(user);continue;}
     79         if(c[i]==8){p[user].arm();u[i]=true;i=0;continue;}
     80         if((c[i]==2&&Can_use_kill(user))||(c[i]==4&&Can_duel(user))||(c[i]==5)||(c[i]==6))
     81         {
     82             u[i]=true;
     83             return c[i];
     84         }
     85     }
     86     return 0;
     87 }
     88 void Use(int user,int type)
     89 {
     90     if(type==2)Use_kill(user);
     91     if(type==4)Use_duel(user);
     92     if(type==5)Use_Sprq(user);
     93     if(type==6)Use_Ttaf(user);
     94     return ;
     95 }
     96 void Peach_use_prol(int user){if(p[user].Hp==4)return ;p[user].eat_peach();}
     97 bool Can_use_kill(int user)
     98 {
     99     int enemy=p[user].nxt;
    100     if(p[user].nmk>=1&&!p[user].Wep)return false;
    101     if(p[user].Mp)if((p[enemy].Apd&&p[enemy].aA)||p[enemy].LA){p[user].nmk++;return true;}
    102     if(!p[enemy].Apd)return false;
    103     if((p[enemy].aZ&&p[user].Ap)||(p[enemy].aA&&p[user].Zp)||(p[enemy].Mp&&p[user].Ap))
    104     {
    105         p[user].nmk++;
    106         return true;
    107     }
    108     return false;
    109 }
    110 bool Can_duel(int user)
    111 {
    112     if(p[user].Ap)return true;
    113     if(p[user].Zp)for(int i=p[user].nxt;i!=user;i=p[i].nxt)if(p[i].aA)return true;
    114     if(p[user].Mp)for(int i=p[user].nxt;i!=user;i=p[i].nxt)if(p[i].LA||p[i].aA)return true;
    115     return false;
    116 }
    117 void check(void){if(p[1].Hp<=0||!numA)Game_is_going_on=false;}
    118 void Use_kill(int user)
    119 {
    120     int enemy=p[user].nxt;
    121     Apear(user);
    122     if(p[enemy].use_dodge())return ;
    123     Cur(enemy,user,1);
    124 }
    125 void Use_duel(int user)
    126 {
    127     int enemy=Enyd(user);
    128     if(user==1&&p[enemy].LA&&!p[enemy].Apd)return Cur(enemy,user,1);
    129     Apear(user);
    130     if(Nxkj(user,enemy))return ;
    131     while(p[enemy].use_kill())std::swap(user,enemy);
    132     Cur(enemy,user,1);
    133     return ;
    134 }
    135 void Use_Sprq(int user)
    136 {
    137     for(int i=p[user].nxt;i!=user;i=p[i].nxt)
    138     {
    139         if(Nxkj(user,i))continue;
    140         if(p[i].use_kill())continue;Cur(i,user,1);
    141         if(i==1&&!p[user].Apd)p[user].LA=true;
    142     }
    143 }
    144 void Use_Ttaf(int user)
    145 {
    146     for(int i=p[user].nxt;i!=user;i=p[i].nxt)
    147     {
    148         if(Nxkj(user,i))continue;
    149         if(p[i].use_dodge())continue;
    150         Cur(i,user,1);
    151         if(i==1&&!p[user].Apd) p[user].LA=true;
    152     }
    153 }
    154 void Apear(int user)
    155 {
    156     p[user].aM=p[user].Mp,p[user].aZ=p[user].Zp,p[user].aA=p[user].Ap;
    157     p[user].LA=false,p[user].Apd=true;
    158 }
    159 void Cur(int user,int killer,int dlt)
    160 {
    161     p[user].Hp--;
    162     if(p[user].Hp>0)return ;
    163     while(p[user].Hp<=0&&p[user].eat_peach());
    164     if(p[user].Hp<=0)
    165         Die(user,killer);
    166 }
    167 int Enyd(int user)
    168 {
    169     if(p[user].Ap)return 1;
    170     for(int i=p[user].nxt;i!=user;i=p[i].nxt)
    171         if((p[i].Apd&&p[i].aA)||((!p[i].Apd)&&p[i].LA&&p[user].Mp))
    172             return i;
    173 }
    174 bool Nxkj(int user,int chr)
    175 {
    176     bool ansl;
    177     if(!p[chr].Apd)return false;
    178     int i=user;
    179     ansl=false;
    180     do{
    181         if(Rlts(i,chr)&&p[i].use_nxkj()){Apear(i);return !Nxkj(i,anti(chr));}
    182         i=p[i].nxt;
    183     }while(i!=user);
    184     return false;
    185 }
    186 bool Rlts(int usr_a,int U)
    187 {
    188     if((p[usr_a].Mp&&p[U].Mp)||(p[usr_a].Zp&&p[U].aZ)||(p[usr_a].Zp&&p[U].aM)||(p[usr_a].Mp&&p[U].aZ)||(p[usr_a].Ap&&p[U].aA))
    189         return true;
    190     return false;
    191 }
    192 void Die(int user,int killer)
    193 {
    194     p[user].dead=true;
    195     p[p[user].lst].nxt=p[user].nxt;
    196     p[p[user].nxt].lst=p[user].lst;
    197     if(p[user].Ap){numA--;if(!numA)Game_end();for(int i=1;i<=3;i++)p[killer].Drw();}
    198     if(p[user].Mp)Game_end();
    199     if(p[user].Zp&&killer==1)p[1].clear();
    200 }
    201 void Game_end(void)
    202 {
    203     if(!numA) puts("MP");else puts("FP");
    204     for(int i=1;i<=n;i++)p[i].print();exit(0);
    205 }
    206 int anti(int user){if(p[user].Ap)return 80;return 81;}
    207 void print_it(int x)
    208 {
    209     if(x==1)printf("P ");
    210     if(x==2)printf("K ");
    211     if(x==3)printf("D ");
    212     if(x==4)printf("F ");
    213     if(x==5)printf("N ");
    214     if(x==6)printf("W ");
    215     if(x==7)printf("J ");
    216     if(x==8)printf("Z ");
    217 }
    218 void Pig::Profile(char *a)
    219 {
    220     Hp=4;
    221     if(a[1]=='M'){Mp=true;aM=true;Apd=true;}
    222     if(a[1]=='Z')Zp=true;
    223     if(a[1]=='F'){Ap=true;numA++;}
    224 }
    225 void Pig::Insert(int x){card[++num]=x;usd[num]=false;}
    226 void Pig::New(void){nmk=0;}
    227 void Pig::Drw(void){if(!top)top=1;Insert(hep[top--]);}
    228 void Pig::arm(void){Wep=true;}
    229 bool Pig::eat_peach(void)
    230 {
    231     if(Hp==4)return false;
    232     for(int i=1;i<=num;i++)
    233     if(usd[i]==0&&card[i]==1)
    234     {if(Hp==4)return false;usd[i]=true;Hp++;return true;}
    235     return false;
    236 }
    237 bool Pig::use_dodge(void)
    238 {
    239     for(int i=1;i<=num;i++)if(usd[i]==0&&card[i]==3){usd[i]=true;return true;}
    240     return false;
    241 }
    242 bool Pig::use_kill(void)
    243 {
    244     for(int i=1;i<=num;i++)if(usd[i]==0&&card[i]==2){usd[i]=true;return true;}
    245     return false;
    246 }
    247 bool Pig::use_nxkj(void)
    248 {
    249     for(int i=1;i<=num;i++) if(usd[i]==0&&card[i]==7){usd[i]=true;return true;}
    250     return false;
    251 }
    252 void Pig::clear(void)
    253 {
    254     num=0,Wep=false;
    255     memset(card,0,sizeof(card));memset(usd,0,sizeof(usd));
    256 }
    257 void Pig::print(void)
    258 {
    259     if(dead) printf("DEAD");
    260     else for(int i=1;i<=num;i++)if(!usd[i])print_it(card[i]);
    261     printf("
    ");
    262 }
    263 void Pig::pro(void){if(Mp)printf("Mp ");if(Zp)printf("Zp ");if(Ap)printf("Ap ");}
  • 相关阅读:
    获取一个数组里面第K大的元素
    小白初识 归并排序(MergeSort)
    小白初识 基数排序(RadixSort)
    memset()的正确用法
    HDU2071(水题)
    HDU 2090
    并查集模板
    HDU 1222
    HDU1084(快速排序)
    HDU 2043
  • 原文地址:https://www.cnblogs.com/blog-Dr-J/p/9895487.html
Copyright © 2020-2023  润新知