• BZOJ[1972] [Sdoi2010]猪国杀


    第二道大模拟

      1 #include <cmath>
      2 #include <cstdio>
      3 #include <cstdlib>
      4 #include <cstring>
      5 #include <iostream>
      6 #include <algorithm>
      7 using namespace std;
      8 void ot(){cout<<"******"<<endl;}
      9 int n,m;
     10 int now_time;
     11 struct PIG{
     12     int id;  //0 MP;  1 ZP;  2 AP;
     13     char cd[20010]; bool pd[20010];
     14     int head,tail,Hp,Eq,Z,F,SZ,SF,K,num;
     15     PIG(){
     16         head=tail=0; Hp=4; Eq=0; K=0;
     17     }
     18     void P(){
     19         printf("  num= %d  id= %d",num,id);
     20         if(Hp<=0){printf("   Dead
    
    "); return;}
     21         printf("  Hp= %d  Eq= %d  Z= %d  F= %d  SZ= %d  SF= %d
    ",Hp,Eq,Z,F,SZ,SF);
     22         printf("   card: ");
     23         for(int k=head;k<tail;k++){
     24             if(pd[k]) continue;
     25             cout<<cd[k]<<" ";
     26         } cout<<endl;
     27     }
     28 }p[11];
     29 int tot_FP;
     30 bool MP_dead;
     31 int MP;
     32 void init(){
     33     scanf("%d%d",&n,&m);
     34     char s[3];
     35     for(int i=0;i<n;i++){
     36         scanf("%s",&s);
     37         if(s[0]=='M') p[i].id=0,MP=i;
     38         if(s[0]=='Z') p[i].id=1;
     39         if(s[0]=='F') p[i].id=2,tot_FP++;
     40         p[i].num=i;
     41         for(int j=1;j<=4;j++){
     42             scanf("%s",&s);
     43             p[i].cd[p[i].tail++]=s[0];
     44         }
     45     }
     46 }    
     47 int tot_card;
     48 char last;
     49 void Get_card(int now,int lim){
     50     // printf("Get::
    ");
     51     char s[3];
     52     // printf("  %d -- ",p[now].num);
     53     for(int i=1;i<=lim;i++){
     54         tot_card++;
     55         if(tot_card<=m){
     56             scanf("%s",&s);
     57             p[now].cd[p[now].tail++]=s[0];
     58             last=s[0];
     59             // cout<<s[0]<<" ";
     60         }
     61         else{
     62             p[now].cd[p[now].tail++]=last;
     63             // cout<<last<<" ";
     64         }
     65 
     66     }
     67     // cout<<endl<<endl;
     68 }
     69 void Beg(int now){
     70     p[now].K=0;
     71 }
     72 bool O_fla(int k){
     73     for(int c=p[k].head;c<p[k].tail;c++){
     74         if(p[k].pd[c]) continue;
     75         if(p[k].cd[c]=='D') {
     76             // printf("  %d out D
    ",p[k].num);
     77             p[k].pd[c]=1; return 1;
     78         }
     79     }
     80     return 0;
     81 }
     82 bool O_S(int k){
     83     for(int c=p[k].head;c<p[k].tail;c++){
     84         if(p[k].pd[c]) continue;
     85         if(p[k].cd[c]=='K') {
     86             // printf("  %d out K
    ",p[k].num);
     87             p[k].pd[c]=1; return 1;
     88         }
     89     }
     90     return 0;    
     91 }
     92 bool O_P(int now){
     93     if(p[now].Hp<4) {
     94         p[now].Hp++;
     95         // printf("  %d out P, and Hp++ to %d
    ",p[now].num,p[now].Hp);
     96         return 1;
     97     }
     98     return 0;
     99 }
    100 bool Dead(int k){
    101     if(p[k].Hp>0) return 0;
    102     for(int c=p[k].head;c<p[k].tail;c++){
    103         if(p[k].pd[c]) continue;
    104         if(p[k].cd[c]=='P'){
    105             p[k].pd[c]=1; p[k].Hp++; 
    106             // printf("  %d out P, and Hp++ to %d
    ",p[k].num,p[k].Hp);
    107             return 0;
    108         }
    109     }
    110     if(p[k].id==2) tot_FP--;
    111     if(p[k].id==0) MP_dead=1;
    112     // printf("  %d Dead
    ",p[k].num);
    113     return 1;
    114 }
    115 bool O_K(int now){
    116     if(p[now].K && !p[now].Eq) return 0;
    117     int k=(now+1)%n; while(p[k].Hp<=0) k=(k+1)%n; if(k==now) return 0;
    118     if(p[now].id==0){
    119         if(p[k].F || p[k].SF){
    120             p[now].K=1;
    121             // printf("  %d out K to %d
    ",p[now].num,p[k].num);
    122             if(O_fla(k)) return 1;
    123             else{
    124                 p[k].Hp--;
    125                 // printf("  %d Hp-- to %d
    ",p[k].num,p[k].Hp);
    126                 if(Dead(k)){
    127                     if(p[k].id==2){
    128                         if(tot_FP==0) return 1;
    129                         // printf("  %d Kill F , Get card::
    ",p[now].num,p[k].num);
    130                         Get_card(now,3);
    131                     }
    132                     if(p[k].id==1){
    133                         // printf("  %d Kill Z %d  so he lose card
    ",p[now].num,p[k].num);
    134                         p[now].head=p[now].tail; p[now].Eq=0; return 1;
    135                     }
    136                 }
    137             }
    138             return 1;
    139         }
    140         else return 0;
    141     }
    142     if(p[now].id==1){
    143         if(p[k].F){
    144             p[now].K=1; p[now].Z=1;
    145             // printf("  %d out K to %d, and %d Z 
    ",p[now].num,p[k].num,p[now].num);
    146             if(O_fla(k)) return 1;
    147             else{
    148                 p[k].Hp--;
    149                 // printf("  %d Hp-- to %d
    ",p[k].num,p[k].Hp);
    150                 if(Dead(k)){
    151                     if(p[k].id==2){
    152                         if(tot_FP==0) return 1;
    153                         // printf("  %d Kill F %d, Get card::",p[now].num,p[k].num);
    154                         Get_card(now,3);
    155                     }
    156                 }
    157             }
    158             return 1;
    159         }
    160         else return 0;
    161     }
    162     if(p[now].id==2){
    163         if(p[k].id==0 || p[k].Z){
    164             p[now].K=1; p[now].F=1;
    165             // printf("  %d out K to %d, and %d F 
    ",p[now].num,p[k].num,p[now].num);
    166             if(O_fla(k)) return 1;
    167             else{
    168                 p[k].Hp--;
    169                 // printf("  %d Hp-- to %d
    ",p[k].num,p[k].Hp);
    170                 if(Dead(k)){
    171                     if(p[k].id==2){
    172                         if(tot_FP==0) return 1;
    173                         Get_card(now,3);
    174                         // printf("  %d Kill F %d, Get card::",p[now].num,p[k].num);
    175                     }
    176                     if(p[k].id==0){
    177                         if(MP_dead) return 1;
    178                     }
    179                 }
    180             }
    181             return 1;
    182         }
    183         else return 0;
    184     }
    185     return 0;
    186 }
    187 bool Hav_J(int now){
    188     for(int c=p[now].head;c<p[now].tail;c++){
    189         if(p[now].pd[c]) continue;
    190         if(p[now].cd[c]=='J'){
    191             // printf("  %d out J
    ",p[now].num);
    192             p[now].pd[c]=1; return 1;
    193         }
    194     }
    195     return 0;
    196 } 
    197 bool Tog_J(int now,int t){
    198     int k=now,cnt=0;
    199     if(!t){
    200         while( cnt<n && (p[k].Hp<=0 || p[k].id!=2 || !Hav_J(k)) ) k=(k+1)%n, cnt++;
    201         if(cnt==n) return 0;
    202         p[k].F=1; 
    203         // printf("  %d F
    ",p[k].num);
    204         if(Tog_J(k,1)) return 0;
    205         else return 1;
    206     }
    207     if(t){
    208         while( cnt<n && (p[k].Hp<=0 || p[k].id==2 || !Hav_J(k)) ) k=(k+1)%n, cnt++;
    209         if(cnt==n) return 0;
    210         p[k].Z=1;
    211         // printf("  %d Z
    ",p[k].num);
    212         if(p[k].SF){
    213             p[k].SF=0; //printf("    so %d -> SF == 0
    ",p[k].id);
    214         }
    215         if(Tog_J(k,0)) return 0;
    216         else return 1;
    217     }
    218 
    219 }
    220 bool O_F(int now){
    221     int k=(now+1)%n; while(p[k].Hp<=0) k=(k+1)%n; if(now==k) return 0;
    222     int rol=1;
    223     bool ok1,ok2,ok3; ok1=ok2=ok3=0;
    224     if(p[now].id==0){
    225         while( ( (!p[k].F && !p[k].SF) || p[k].Hp<=0) && k!=now) k=(k+1)%n;
    226         if(k==now) return 0;
    227         // printf("  %d out F to %d
    ",p[now].num,p[k].num);
    228         if(p[k].F) ok1=1; else ok1=0;
    229         if(ok1) ok2=Tog_J(now,0); if(ok1 && ok2) return 1;
    230         if(p[k].id==1){
    231             // printf("  %d is ZF ,so Hp-- to %d
    ",p[k].num,p[k].Hp);
    232             p[k].Hp--;
    233             if(Dead(k)){
    234                 // printf("  %d Kill Z %d  so he lose card
    ",p[now].num,p[k].num);
    235                 p[now].head=p[now].tail; p[k].Eq=0; return 1;
    236             }
    237         }
    238         else{
    239             while(1){
    240                 if(rol && !O_S(k)){
    241                     p[k].Hp--;
    242                     // printf("  %d Hp-- to %d
    ",p[k].num,p[k].Hp);
    243                     if(Dead(k)){
    244                         if(p[k].id==2){
    245                             if(tot_FP==0) return 1;
    246                             // printf("  %d Kill F %d, Get card::",p[now].num,p[k].num);
    247                             Get_card(now,3);
    248                             return 1;
    249                         }
    250                         if(p[k].id==1){
    251                             // printf("  %d Kill Z %d  so he lose card
    ",p[now].num,p[k].num);
    252                             p[now].head=p[now].tail; p[now].Eq=0; return 1;
    253                         }
    254                     }
    255                     return 1;
    256                 }
    257                 else if(!rol && !O_S(now)){
    258                     p[now].Hp--;
    259                     // printf("  %d Hp-- to %d
    ",p[now].num,p[now].Hp);
    260                     if(Dead(now)) return 1;
    261                     return 1;
    262                 }
    263                 rol^=1;
    264             }
    265         }
    266     }
    267     if(p[now].id==1){
    268         while( ( !p[k].F || p[k].Hp<=0) && k!=now) k=(k+1)%n;
    269         if(k==now) return 0;
    270         p[now].Z=1;
    271         // printf("  %d out F to %d, and %d Z 
    ",p[now].num,p[k].num,p[now].num);
    272         if(p[now].SF){
    273             p[now].SF=0; //printf("    so %d -> SF == 0
    ",p[now].id);
    274         }
    275         ok2=Tog_J(now,0); if(ok2) return 1;
    276         while(1){
    277             if(rol && !O_S(k)){
    278                 p[k].Hp--;
    279                 // printf("  %d Hp-- to %d
    ",p[k].num,p[k].Hp);
    280                 if(Dead(k)){
    281                     if(p[k].id==2){
    282                         if(tot_FP==0) return 1;
    283                         // printf("  %d Kill F %d, Get card::",p[now].num,p[k].num);
    284                         Get_card(now,3);
    285                         return 1;
    286                     }
    287                 }
    288                 return 1;
    289             }
    290             else if(!rol && !O_S(now)){
    291                 p[now].Hp--;
    292                 // printf("  %d Hp-- to %d
    ",p[now].num,p[now].Hp);
    293                 if(Dead(now)) return 1;
    294                 return 1;
    295             }
    296             rol^=1;
    297         }
    298     }
    299     if(p[now].id==2){
    300         p[now].F=1; k=MP;
    301         // printf("  %d out F to %d, and %d F 
    ",p[now].num,p[k].num,p[now].num);
    302         ok2=Hav_J(k);
    303         ok2=Tog_J(now,1); if(ok2) return 1;
    304         while(1){
    305             if(rol && !O_S(MP)){
    306                 p[MP].Hp--;
    307                 // printf("  %d Hp-- to %d
    ",p[k].num,p[k].Hp);
    308                 if(Dead(k)) return 1;
    309                 return 1;
    310             }
    311             else if(!rol && !O_S(now)){
    312                 p[now].Hp--;
    313                 // printf("  %d Hp-- to %d
    ",p[now].num,p[now].Hp);
    314                 if(Dead(now)){
    315                     // printf("  %d Kill F %d, Get card::",p[k].num,p[now].num);
    316                     Get_card(MP,3); return 1;
    317                 }
    318                 return 1;
    319             }
    320             rol^=1;
    321         }
    322     }
    323     return 1;
    324 }
    325 bool O_N(int now){
    326     int k=(now+1)%n;
    327     // printf("  %d out N
    ",p[now].num);
    328     bool ok1,ok2,ok3; ok1=ok2=ok3=0;
    329     while(k!=now){
    330         if(p[k].Hp<=0){k=(k+1)%n; continue;}
    331         // printf("  Is %d turn:: ",p[k].num);
    332         if( p[k].id==0 || p[k].Z){
    333             ok2=Tog_J(now,1);
    334             if( !ok2 && !O_S(k)){
    335                 p[k].Hp--; 
    336                 // printf("  %d Hp-- to %d
    ",p[k].num,p[k].Hp);
    337                 if(p[k].id==0 && !p[now].Z){
    338                     p[now].SF=1;
    339                     // printf("  %d is marked SF
    ",p[now].num);
    340                 }
    341                 if(Dead(k)){
    342                     if(p[now].id==0){
    343                         // printf("  %d Kill Z %d  so he lose card
    ",p[now].num,p[k].num);
    344                         p[now].head=p[now].tail, p[now].Eq=0;
    345                     }
    346                     if(p[k].id==0) {MP_dead=1; return 1;}
    347                 }
    348             }
    349         }
    350         else if( p[k].F ){
    351             ok2=Tog_J(now,0);
    352             if( !ok2 && !O_S(k)){
    353                 p[k].Hp--;
    354                 // printf("  %d Hp-- to %d
    ",p[k].num,p[k].Hp);
    355                 if(Dead(k)){
    356                     if(tot_FP==0) return 1;
    357                     // printf("  %d Kill F %d, Get card::",p[now].num,p[k].num);
    358                     Get_card(now,3);
    359                 }
    360             }
    361         }
    362         else if(!O_S(k)){ 
    363             p[k].Hp--;
    364             // printf("  %d Hp-- to %d
    ",p[k].num,p[k].Hp);
    365             if(Dead(k)){
    366                 if(p[k].id==1 && p[now].id==0){
    367                     // printf("  %d Kill Z %d  so he lose card
    ",p[now].num,p[k].num);
    368                     p[now].head=p[now].tail; p[now].Eq=0;
    369                 }
    370                 if(p[k].id==2){
    371                     if(tot_FP==0) return 1;
    372                     Get_card(now,3);
    373                     // printf("  %d Kill F %d, Get card::",p[now].num,p[k].num);
    374                 }
    375             }    
    376         }
    377         k=(k+1)%n;
    378     }
    379     return 1;
    380 }
    381 bool O_W(int now){
    382     int k=(now+1)%n;
    383     // printf("  %d out W
    ",p[now].num);
    384     bool ok1,ok2,ok3; ok1=ok2=ok3=0;
    385     while(k!=now){
    386         if(p[k].Hp<=0){k=(k+1)%n; continue;}
    387         // printf("  Is %d turn:: ",p[k].num);
    388         if( p[k].id==0 || p[k].Z){
    389             ok2=Tog_J(now,1);
    390             if( !ok2 && !O_fla(k)){
    391                 p[k].Hp--; 
    392                 // printf("  %d Hp-- to %d
    ",p[k].num,p[k].Hp);
    393                 if(p[k].id==0 && !p[now].Z){
    394                     p[now].SF=1;
    395                     // printf("  %d is marked SF
    ",p[now].num);
    396                 }
    397                 if(Dead(k)){
    398                     if(p[now].id==0){
    399                         // printf("  %d Kill Z %d  so he lose card
    ",p[now].num,p[k].num);
    400                         p[now].head=p[now].tail, p[now].Eq=0;
    401                     }
    402                     if(p[k].id==0) {MP_dead=1; return 1;}
    403                 }
    404             }
    405             // if(now_time==4) exit(0);
    406         }
    407         else if( p[k].F ){
    408             ok2=Tog_J(now,0);
    409             if( !ok2 && !O_fla(k)){
    410                 p[k].Hp--;
    411                 // printf("  %d Hp-- to %d
    ",p[k].num,p[k].Hp);
    412                 if(Dead(k)){
    413                     if(tot_FP==0) return 1;
    414                     // printf("  %d Kill F %d, Get card::",p[now].num,p[k].num);
    415                     Get_card(now,3);
    416                 }
    417             }
    418         }
    419         else if(!O_fla(k)){ 
    420             p[k].Hp--;
    421             // printf("  %d Hp-- to %d
    ",p[k].num,p[k].Hp);
    422             if(Dead(k)){
    423                 if(p[k].id==1 && p[now].id==0){
    424                     // printf("  %d Kill Z %d  so he lose card
    ",p[now].num,p[k].num);
    425                     p[now].head=p[now].tail; p[now].Eq=0;
    426                 }
    427                 if(p[k].id==2){
    428                     if(tot_FP==0) return 1;
    429                     // printf("  %d Kill F %d, Get card::",p[now].num,p[k].num);
    430                     Get_card(now,3);
    431                 }
    432             }    
    433         }
    434         k=(k+1)%n;
    435     }
    436     return 1;
    437 }
    438 bool O_Z(int now){ 
    439     // printf("  %d out Z-G-L-N
    ",p[now].num);
    440     p[now].Eq=1; return 1; 
    441 }
    442 void Out(int now){
    443     int c; int cnt=0;
    444     // printf("Out::
    "); 
    445     for(int c=p[now].head;c<p[now].tail;c++){
    446         if(MP_dead || tot_FP==0 || p[now].Hp<=0) break;
    447         if(c<p[now].head) c=p[now].head;
    448         if(p[now].pd[c]) continue; cnt++; bool ok=1;
    449         // if(now_time==7){p[now].P();}
    450         // printf("  Card %d ::
    ",cnt);
    451         if(p[now].cd[c]=='P' && (ok=O_P(now)) ) p[now].pd[c]=1;
    452         // if(!ok){printf("  can't out P
    ");} ok=1;
    453         if(p[now].cd[c]=='K' && (ok=O_K(now)) ) p[now].pd[c]=1;
    454         // if(!ok){printf("  can't out K
    ");} ok=1;
    455         if(p[now].cd[c]=='D') {
    456             // printf("  can't out D
    ");  
    457             continue;
    458         }
    459         if(p[now].cd[c]=='F' && (ok=O_F(now)) ) {p[now].pd[c]=1,c=p[now].head-1,cnt=0; continue;}
    460         // if(!ok){printf("  can't out F
    ");} ok=1;
    461         if(p[now].cd[c]=='N' && (ok=O_N(now)) ) {p[now].pd[c]=1,c=p[now].head-1,cnt=0; continue;}
    462         // if(!ok){printf("  can't out N
    ");} ok=1;
    463         if(p[now].cd[c]=='W' && (ok=O_W(now)) ) {p[now].pd[c]=1,c=p[now].head-1,cnt=0; continue;}
    464         // if(!ok){printf("  can't out W
    ");} ok=1;
    465         if(p[now].cd[c]=='J') {
    466             // printf("  can't out J
    ");  
    467             continue;
    468         }
    469         if(p[now].cd[c]=='Z' && O_Z(now) ) {p[now].pd[c]=1,c=p[now].head-1,cnt=0; continue;} 
    470     }
    471     while(p[now].pd[p[now].head]) p[now].head++;
    472     // cout<<endl<<endl;
    473 }
    474 char sc[2010];
    475 void Print(){
    476     // printf("========= End at round %d  ===========
    ",now_time);
    477     if(tot_FP==0) printf("MP
    ");
    478     else printf("FP
    ");
    479     for(int k=0;k<n;k++){
    480         if(p[k].Hp<=0) printf("DEAD
    ");
    481         else{
    482             int tip=0;
    483             for(int c=p[k].head;c<p[k].tail;c++){
    484                 if(p[k].pd[c]) continue;
    485                 sc[++tip]=p[k].cd[c];
    486             }
    487             for(int i=1;i<=tip;i++){
    488                 if(i!=tip) printf("%c ",sc[i]);
    489                 else printf("%c",sc[i]);
    490             } printf("
    ");
    491         }
    492     }
    493 }
    494 void oott(){
    495     printf("Pig::
    ");
    496     for(int k=0;k<n;k++){
    497         p[k].P();
    498     } cout<<endl;
    499 }
    500 void Begin_game(){
    501     int now=MP; now_time=0;
    502     while(1){
    503         if(p[now].Hp<=0){now=(now+1)%n; continue;}
    504         now_time++;
    505         // printf("---------------  round %d   now= %d ------------
    ",now_time,now);
    506         // oott();
    507         Get_card(now,2);
    508         Beg(now);
    509         Out(now);
    510         if(MP_dead || tot_FP==0) break;
    511         now=(now+1)%n;
    512         // oott();
    513     }
    514     Print();
    515 }
    516 int main(){
    517     // freopen("kopk7.in","r",stdin);
    518     // freopen("1pigkao.out","w",stdout);
    519     init();
    520     Begin_game();
    521     return 0;
    522 }
    Pig杀

    开启所有注释即可打印战斗日志

  • 相关阅读:
    Elasticsearch5.3 学习(一):安装、Yii2.0 下载es扩展
    lnmp 环境require(): open_basedir restriction in effect 错误
    Ueditor编辑器图片上传到万象优图
    Linux curl 模拟form表单提交信息和文件
    CP936 转换成 UTF-8
    wamp 两个不同的php.ini
    PHP浮点数运算精度造成的,订单金额支付经常少1分的问题
    进制相关:存储与转换
    Python的数据类型
    pycharm+PyQt5 开发配置
  • 原文地址:https://www.cnblogs.com/FOXYY/p/7651841.html
Copyright © 2020-2023  润新知