HDU 3378

http://acm.hdu.edu.cn/showproblem.php?pid=3378

规则去玩三国杀就理解了

纯模拟

注意的点:有已经分出胜负但还在杀的情况出现,所以要每次杀操作前判断是否分出胜负,如果已经分出胜负了就continue,不用接着往下操作

#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('
') ;
    }
    return 0 ;
}
View Code
原文地址:https://www.cnblogs.com/xiaohongmao/p/3505626.html