zoukankan      html  css  js  c++  java
  • 大模拟1.0

              小学期集训结束前我说过想见识见识大搜索大模拟OwO,现在我的愿望已经充分得到了满足……

      猪国杀

    先附一个可读版规则【幕布·猪国杀可读版】,做题过程发出来基本就是题解……从来没有打过三国杀的人从这道题中开拓了视野丰富了人生……

    questions

    1.桃:在自己的回合外血变为0或更低可以使用
    死亡:体力降到0或更低,并且手中没有足够的桃回到1就死亡
    如果吃了桃还不够是吃了再死还是直接死?
    A:无所谓,因为不要求输出已死玩家的牌。何况体力不可能比0还低
    如果要求得细一点,就是回合外补到1就停下,之后有危险会再得到机会的

    2.杀是基本牌不是锦囊牌,无懈可击在目标锦囊生效前抵消效果
    表敌意包括使用杀
    无懈可击可以抵消表敌意
    那无懈可击到底抵不抵消杀?
    A:不抵,不要管那个诡异叙述

    3.什么样的情况下献殷勤居然被抵消了?
    一只猪向同伙猪献殷勤,敌人阻止它献殷勤

    4.决斗中的献殷勤是怎么回事?
    A:向敌人决斗,敌人被敌人一伙救了,就是敌人被献殷勤了~

    5.挡下万箭齐发到底属于对谁献殷勤?
    A:对本来会受到伤害的那只猪、本来被表敌意的那只猪

    UPD:这些question只因为我是个没打过三国杀的人……

    problems

    1.清空了主猪的牌也要清空主猪的使用记录

    2.决斗是被挑战方先弃杀,然后挑战方弃这样循环,先没有牌弃的掉血。即使挑战方现在也没有
    牌而轮到被挑战方,也算被挑战方输

    3.决斗的无懈可击在决斗开始前生效,南猪入侵和万箭齐发的无懈可击在结算到相应角色时生效

    4.主猪的编号是1不是0,主猪一开始就已明身份

    5.回合里出完每一张牌都需要检查游戏是否结束,不结束还要从头开始遍历这只猪的所有牌。
    会有新的猪跳导致这只猪原来没有出的牌可以出了

    6.题本身的坑:牌堆里没牌了一直抽最后一张,反猪是FP不是AP,最多10头猪不是5头

    7.最先有机会无懈可击的是出锦囊的猪自己。它可以无懈掉自己的南猪入侵或万箭齐发来保护同伙

    simples

    1.

    5 10
    MP W D F K
    ZP N N D D
    FP F W W K
    ZP K K N D
    FP K D P W
    J K W K D N N K J N

    MP
    F N
    D
    DEAD

    DEAD

    2.

    3 4
    MP J J K N
    ZP J D K W
    FP P N P K
    J J K W

    MP
    K
    K
    DEAD

    3.

    3 10
    MP W D J W
    ZP J P D N
    FP N D F F
    J D N N F J J D K W

    MP
    D J D

    DEAD

    4.

    3 1
    MP D N F K
    ZP F W F N
    FP D N N D
    K

    MP
    K
    F K K
    DEAD

    如果没有小样例只有测试点也不要怕,输出十几步一点点算总能看出来的。打程序的过程是痛苦的,调程序的过程是欢乐的,因为就像打游戏一样一张张看这群猪出什么牌简直上瘾。最难写的是无懈可击,因为是唯一需要递归调用的想了很久才实现出来,不过毕竟是经过深思熟虑这一部分写完就没有出过问题。调的时候问题集中在决斗上,一方面手误不少一方面对规则也不大清晰错了一堆。对题目熟悉了之后感觉题变短了,刚开始一点一点找规则到后来已经可以脱离规则自己玩起来,输出大段调试信息一行一行核对不知不觉几个小时就过去了。10月9号写了一上午只打了个框,10月10号继续写完了无懈可击调了一个晚上,10月11号早上调了一节课下午改完题三点多才过。过程中也经历了很多怀疑自己的时候,比如说牌不用链表维护到底会不会炸掉、到底能不能自己设计出无懈可击、规则里面有很多弄不明白的地方(后来我发现我身边的同学们都是行家啊),总之还是做到了。撑着独立完成了这道题感觉很好,果然年轻人就是应该做点自己都觉得困难的事嘛。下次你们再打三国杀的时候或许我可以去围观了?(鉴于水平仅限于这道题还是不要参加的好)不过这种题要是放出来考真是可怕啊。

      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cstring>
      4 #include<queue>
      5 using namespace std;
      6 const int pig=12;
      7 const int card=4005;
      8 int  tot[pig],cnt[pig],typ[pig],tl[pig],real[pig];
      9 bool zb[pig],used[pig][card],dead[pig],like[pig];
     10 char p[pig][card];//about every pig
     11 int  n,m,sum,cot,nt[pig],pr[pig],aim;
     12 bool op;
     13 char a[5],la,tp;
     14 queue<char>  q;//about the game
     15 void init()
     16 {
     17     scanf("%d%d",&n,&m);
     18     for(int i=1;i<=n;i++)
     19     {
     20         pr[i]=i-1,nt[i]=i+1;
     21         tl[i]=tot[i]=cnt[i]=4;
     22         scanf("%s",a);
     23         if(a[0]=='M')  typ[i]=0;//main
     24         if(a[0]=='Z')  typ[i]=1;//zhong
     25         if(a[0]=='F')  typ[i]=2;//anti
     26         for(int j=1;j<=4;j++)
     27             scanf("%s",a),p[i][j]=a[0];
     28     }
     29     real[1]=1,pr[1]=n,nt[n]=1;
     30     for(int i=1;i<=m;i++)
     31         scanf("%s",a),q.push(a[0]);//heap
     32 }//scanf the data  *
     33 void mp(int x,int tim)
     34 {
     35     for(int i=1;i<=tim;i++)
     36     {
     37         if(!q.empty())  tp=q.front(),q.pop();
     38         else            tp=la;
     39         tot[x]++,cnt[x]++;
     40         p[x][tot[x]]=tp;
     41         if(q.empty())  la=tp;
     42     }
     43 }//get new cards  *
     44 void outit()
     45 {
     46     if(dead[1])  printf("FP
    ");
     47     else         printf("MP
    ");//who win
     48     for(int i=1;i<n;i++)
     49     {
     50         if(dead[i])  printf("DEAD
    ");
     51         else
     52         {
     53             if(cnt[i]==0){  printf("
    ");continue;  }
     54             cot=0;
     55             for(int j=1;j<=tot[i];j++)
     56                 if(!used[i][j])
     57                 {   
     58                     cot++,printf("%c",p[i][j]);
     59                     if(cot==cnt[i])  printf("
    ");//prevent spare empty
     60                     else             printf(" ");
     61                 }
     62         }
     63     }
     64     if(dead[n])  printf("DEAD");//prevent spare enter
     65     else
     66     {
     67         if(cnt[n]==0)  return;
     68         cot=0;
     69         for(int j=1;j<=tot[n];j++)
     70             if(!used[n][j])
     71             {
     72                 cot++,printf("%c",p[n][j]);
     73                 if(cot!=cnt[n])  printf(" ");
     74             }
     75     }
     76 }//printf the answer  *
     77 bool check()
     78 { 
     79     if(dead[1])  return 1;//main died
     80     op=1;
     81     for(int i=1;i<=n;i++)
     82         if(!dead[i]&&typ[i]==2)
     83             op=0;//all anti died
     84     if(op)  return 1;
     85     return 0;
     86 }//end the game  *
     87 bool have(int x)
     88 {
     89     for(int i=1;i<=tot[x];i++)
     90         if(!used[x][i]&&p[x][i]=='J')
     91         {
     92             used[x][i]=1;
     93             cnt[x]--;
     94             if(x!=1)  real[x]=typ[x],like[x]=0;
     95             return 1;
     96         }
     97     return 0;
     98 }//have a wuxie then use it  *
     99 bool wx(int ap,int om,bool kind)
    100 {
    101     if(!real[om])  return kind;
    102     if(kind==1&&(typ[ap]==real[om]||(typ[ap]==0&&real[om]==1)))
    103         if(have(ap))
    104             return wx(ap,om,kind^1);
    105     if(kind==0&&(typ[ap]==3-real[om]||(typ[ap]==0&&(real[om]==2||like[om]))))
    106         if(have(ap))
    107             return wx(ap,om,kind^1);
    108     for(int i=nt[ap];i!=ap;i=nt[i])
    109     {
    110         if(kind==1&&(typ[i]==real[om]||(typ[i]==0&&real[om]==1)))
    111             if(have(i))
    112             {
    113                 kind=wx(i,om,kind^1);
    114                 break;
    115             }
    116         if(kind==0&&(typ[i]==3-real[om]||(typ[i]==0&&(real[om]==2||like[om]))))
    117             if(have(i))
    118             {
    119                 kind=wx(i,om,kind^1);
    120                 break;
    121             }
    122     }
    123     return kind;
    124 }//wu xie ke ji
    125 void jz(int x,int killer)
    126 {
    127     if(tl[x]==0)
    128     {
    129         for(int k=1;k<=tot[x];k++)
    130             if(!used[x][k]&&p[x][k]=='P')
    131             {
    132                 used[x][k]=1;
    133                 tl[x]++,cnt[x]--;
    134                 break;
    135             }//have some peaches
    136         if(tl[x]<1)
    137         {
    138             dead[x]=1;
    139             if(check())  return;
    140             if(typ[x]==2)  mp(killer,3);
    141             else  if(typ[x]==1&&killer==1)
    142             {
    143                 tot[1]=cnt[1]=zb[1]=0;
    144                 memset(p[1],0,sizeof(p[1]));
    145                 memset(used[1],0,sizeof(used[1]));
    146             }
    147             nt[pr[x]]=nt[x];
    148             pr[nt[pr[x]]]=pr[x];
    149         }//really died                  
    150     }   
    151 }//kill or save the pig  *
    152 void jd(int x,int y)
    153 {
    154     if(typ[y]==0&&typ[x]==1)  swap(x,y);
    155     if(typ[x]==0&&typ[y]==1)
    156     {
    157         tl[y]--,jz(y,x);
    158         return;
    159     }//main vs zhong
    160     for(int i=1;i<=tot[x];i++)
    161         if(!used[x][i]&&p[x][i]=='K')
    162         {
    163             op=0,used[x][i]=1,cnt[x]--;
    164             for(int j=1;j<=tot[y];j++)
    165                 if(!used[y][j]&&p[y][j]=='K')
    166                 {
    167                     used[y][j]=op=1;
    168                     cnt[y]--;
    169                     break;
    170                 }
    171             if(op==0)
    172             {
    173                 tl[y]--,jz(y,x);
    174                 if(real[y]&&x!=1)  real[x]=typ[x],like[x]=0;
    175                 return;
    176             }//y first have no kill
    177         }
    178     tl[x]--,jz(x,y);
    179     if(real[x]&&y!=1)  real[y]=typ[y],like[y]=0;
    180     return;//x first have no kill
    181 }//jue dou *
    182 void nm(int x)
    183 {
    184     for(int i=nt[x];i!=x;i=nt[i])
    185     {
    186         if(!wx(x,i,1))  continue;
    187         op=0;
    188         for(int j=1;j<=tot[i];j++)
    189             if(!used[i][j]&&p[i][j]=='K')
    190             {
    191                 used[i][j]=op=1;
    192                 cnt[i]--;
    193                 break;
    194             }
    195         if(!op)
    196         {
    197                 tl[i]--,jz(i,x);
    198                 if(check())  return;
    199                 if(!real[x]&&i==1)  like[x]=1;
    200         }
    201     }
    202 }//nan zhu ru qin
    203 void wj(int x)
    204 {
    205     for(int i=nt[x];i!=x;i=nt[i])
    206     {
    207         if(!wx(x,i,1))  continue;
    208         op=0;
    209         for(int j=1;j<=tot[i];j++)
    210             if(!used[i][j]&&p[i][j]=='D')
    211             {
    212                 used[i][j]=op=1;
    213                 cnt[i]--;
    214                 break;
    215             }
    216         if(!op)
    217         {
    218             tl[i]--,jz(i,x);
    219             if(check())  return;
    220             if(!real[x]&&i==1)  like[x]=1;
    221         }
    222     }
    223 }//wan jian qi fa
    224 int main()
    225 {
    226     init();
    227     while(1)
    228     {
    229         if(check())  break;
    230         for(int i=1;i<=n;i++)
    231         {
    232             if(check())  break;
    233             if(dead[i])  continue;
    234             mp(i,2);
    235             cot=0;
    236             for(int j=1;j<=tot[i];j++)
    237             {
    238                 if(dead[i])   break;
    239                 if(check())   break;
    240                 if(used[i][j])  continue;
    241                 if(tl[i]!=4&&p[i][j]=='P')
    242                 {
    243                     used[i][j]=1;
    244                     tl[i]++,cnt[i]--;
    245                 }//peach  *
    246                 if(p[i][j]=='K')
    247                 {
    248                     if(cot!=0&&!zb[i])   continue;//only once
    249                     if(typ[i]==0&&!like[nt[i]]&&real[nt[i]]!=2)  continue;
    250                     if(typ[i]==1&&real[nt[i]]!=2)   continue;
    251                     if(typ[i]==2&&real[nt[i]]!=1)   continue;//have no enemy  
    252                     cot++;
    253                     used[i][j]=1,cnt[i]--,op=0;
    254                     if(real[nt[i]])  real[i]=3-real[nt[i]],like[i]=0;
    255                     for(int k=1;k<=tot[nt[i]];k++)
    256                         if(!used[nt[i]][k]&&p[nt[i]][k]=='D')
    257                         {
    258                             used[nt[i]][k]=op=1;
    259                             cnt[nt[i]]--;
    260                             break;
    261                         }//miss
    262                     if(!op)
    263                     {
    264                         tl[nt[i]]--;
    265                         jz(nt[i],i);
    266                     }
    267                 }//kill   *
    268                 if(p[i][j]=='F')
    269                 {
    270                     aim=0;
    271                     if(typ[i]==2)  aim=1;//anti's aim is main
    272                     else
    273                         for(int k=nt[i];k!=i;k=nt[k])
    274                             if(real[k]==2||(i==1&&like[k]))
    275                             {
    276                                 aim=k;
    277                                 break;
    278                             }
    279                     if(aim==0)  continue;
    280                     if(real[aim]&&i!=1)  real[i]=typ[i],like[i]=0;
    281                     used[i][j]=1,cnt[i]--,op=0;
    282                     if(real[aim])
    283                         if(!wx(i,aim,1))
    284                         {
    285                             op=1,j=0;
    286                             continue;
    287                         }
    288                     if(op==0)   jd(aim,i);
    289                 }//fight   *
    290                 if(p[i][j]=='N') 
    291                 {
    292                     used[i][j]=1,cnt[i]--;    
    293                     nm(i);
    294                 }//north   *
    295                 if(p[i][j]=='W')  
    296                 {
    297                     used[i][j]=1,cnt[i]--;
    298                     wj(i);
    299                 }//wound   *
    300                 if(p[i][j]=='Z')
    301                 {
    302                     used[i][j]=zb[i]=1;
    303                     cnt[i]--;
    304                 }//zhuge   *
    305                 if(used[i][j]&&p[i][j]!='P')  j=0;
    306             }
    307           
    308         }
    309     }
    310     outit();
    311     return 0;
    312 }
    kopk
  • 相关阅读:
    Oracle 多表查询优化
    FZU 2150 Fire Game
    HDU 1058 Humble Numbers
    UVA 11624 Fire!
    POJ 1321 棋盘问题
    线性表的基本操作
    POJ 3414 Pots(广搜输出路径)
    HDU 1495 非常可乐
    POJ 1847 Tram
    POJ 3159 Candies(查分约束)
  • 原文地址:https://www.cnblogs.com/moyiii-/p/7652826.html
Copyright © 2011-2022 走看看