http://acm.hdu.edu.cn/showproblem.php?pid=3378
规则去玩三国杀就理解了
纯模拟
注意的点:有已经分出胜负但还在杀的情况出现,所以要每次杀操作前判断是否分出胜负,如果已经分出胜负了就continue,不用接着往下操作
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <cstdio> #include <cstring> using namespace std ; int n ; typedef struct L{ char js[5] ; int al ; int esc ; int sc ; }L ; L kk[101] ; int pk ; int bjnj,wnj ; int ok() { int f=0 ; int cntfz=0 ; int cntnj=0 ; int cntzc=0 ; for(int i=0 ;i<n ;i++) { if(!strcmp(kk[i].js,"ZG")) { if(kk[i].al) f=1 ; } if(!strcmp(kk[i].js,"FZ")) { if(kk[i].al) cntfz++ ; } if(!strcmp(kk[i].js,"NJ")) { if(kk[i].al) { bjnj=i ; cntnj++ ; } } if(!strcmp(kk[i].js,"ZC")) { if(kk[i].al) cntzc++ ; } } if(!(cntzc+cntfz) && cntnj==1 && f) { pk=1 ; wnj=bjnj ; } if(!(cntfz+cntnj)) { if(pk) { kk[wnj].sc=n ; } for(int i=0 ;i<n ;i++) { if(!strcmp(kk[i].js,"ZG")) kk[i].sc=4+cntzc*2+kk[i].esc ; if(!strcmp(kk[i].js,"ZC")) kk[i].sc=5+cntzc+kk[i].esc ; } return 1 ; } if(!f) { if(cntnj==1 && cntfz==0 && cntzc==0) { for(int i=0 ;i<n ;i++) if(!strcmp(kk[i].js,"ZG")) kk[i].sc=1 ; kk[wnj].sc=4+n*2 ; return 1 ; } for(int i=0 ;i<n ;i++) { if(!strcmp(kk[i].js,"NJ")) if(kk[i].al) kk[i].sc=1 ; if(!strcmp(kk[i].js,"FZ")) kk[i].sc=cntfz*3+kk[i].esc ; } return 1 ; } return 0 ; } int main() { int t ; scanf("%d",&t) ; while(t--) { int m ; scanf("%d%d",&n,&m) ; for(int i=0 ;i<n ;i++) { scanf("%s",kk[i].js) ; kk[i].al=1 ; kk[i].esc=0 ; kk[i].sc=0 ; } pk=0 ; for(int i=0 ;i<m ;i++) { int a,b ; scanf("%d%d",&a,&b) ; if(ok()) continue ; kk[b].al=0 ; if(!strcmp(kk[a].js,"FZ") && (!strcmp(kk[b].js,"ZG"))) { kk[a].esc+=2 ; } if(!strcmp(kk[a].js,"FZ") && (!strcmp(kk[b].js,"ZC"))) { kk[a].esc++ ; } if(!strcmp(kk[a].js,"FZ") && (!strcmp(kk[b].js,"NJ"))) { kk[a].esc++ ; } if(!strcmp(kk[a].js,"ZG") && (!strcmp(kk[b].js,"FZ"))) { kk[a].esc++ ; } if(!strcmp(kk[a].js,"ZG") && (!strcmp(kk[b].js,"NJ"))) { kk[a].esc++ ; } if(!strcmp(kk[a].js,"ZC") && (!strcmp(kk[b].js,"FZ"))) { kk[a].esc++ ; } if(!strcmp(kk[a].js,"ZC") && (!strcmp(kk[b].js,"NJ"))) { kk[a].esc++ ; } } ok() ; for(int i=0 ;i<n ;i++) { if(!i) printf("%d",kk[i].sc) ; else printf(" %d",kk[i].sc) ; } putchar('\n') ; } return 0 ; }