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\n\n"); return;}
 21         printf("  Hp= %d  Eq= %d  Z= %d  F= %d  SZ= %d  SF= %d\n",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::\n");
 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\n",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\n",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\n",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\n",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\n",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\n",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\n",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::\n",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\n",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 \n",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\n",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 \n",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\n",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\n",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\n",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\n",p[k].num);
212         if(p[k].SF){
213             p[k].SF=0; //printf("    so %d -> SF == 0\n",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\n",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\n",p[k].num,p[k].Hp);
232             p[k].Hp--;
233             if(Dead(k)){
234                 // printf("  %d Kill Z %d  so he lose card\n",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\n",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\n",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\n",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 \n",p[now].num,p[k].num,p[now].num);
272         if(p[now].SF){
273             p[now].SF=0; //printf("    so %d -> SF == 0\n",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\n",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\n",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 \n",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\n",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\n",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\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\n",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\n",p[now].num);
340                 }
341                 if(Dead(k)){
342                     if(p[now].id==0){
343                         // printf("  %d Kill Z %d  so he lose card\n",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\n",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\n",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\n",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\n",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\n",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\n",p[now].num);
396                 }
397                 if(Dead(k)){
398                     if(p[now].id==0){
399                         // printf("  %d Kill Z %d  so he lose card\n",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\n",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\n",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\n",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\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::\n"); 
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 ::\n",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\n");} 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\n");} ok=1;
455         if(p[now].cd[c]=='D') {
456             // printf("  can't out D\n");  
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\n");} 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\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\n");} ok=1;
465         if(p[now].cd[c]=='J') {
466             // printf("  can't out J\n");  
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  ===========\n",now_time);
477     if(tot_FP==0) printf("MP\n");
478     else printf("FP\n");
479     for(int k=0;k<n;k++){
480         if(p[k].Hp<=0) printf("DEAD\n");
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("\n");
491         }
492     }
493 }
494 void oott(){
495     printf("Pig::\n");
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 ------------\n",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杀

 

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

posted @ 2017-10-11 17:43  Nawox  阅读(167)  评论(0编辑  收藏  举报