17228 真.狼人游戏

17228 真.狼人游戏

时间限制:1000MS  内存限制:65535K
提交次数:29 通过次数:3 收入:158

题型: 编程题   语言: G++;GCC

Description

去长春的飞机上,Bear Kids队跟One Piece队的队员深感无聊,于是,他们6个人玩起了一个很简单的游戏。
游戏规则是这样的,简化版狼人游戏,游戏中,身份只有两种,平民跟狼人。
游戏分为天黑阶段跟天亮阶段,天黑的时候,狼人们会统一杀死一个平民,记住,是统一,随机,而已只有一个!
天亮的时候,所有人会出来投票杀死一个人,平民的话,会随机投一个人,当然,他不会投自己,狼人的话,他们会统一意见,集中投死一个平民,当然,也是随机。
得票最高的人就要被处死,如果有多人票数相同,则编号小的那个人被处死。
当游戏成员只剩平民时,平民胜利;当游戏成员只剩狼人时,狼人胜利。
那天,这六个人约好,输的一方请吃饭。六个人中,有两个狼人,四个平民,YYS跟WYH是狼人,LY,LYS,胖子,小马哥是平民,他们的游戏ID分别是1,2,3,4,5,6。
第一轮天黑的时候,YYS跟WYH就把LYS杀了,天亮的时候,YYS投了小马哥,WYH当然也投了小马哥,LY投了YYS,胖子投了LY,小马哥投了YYS(平民是随机投票的),
这时,由于YYS跟小马哥的票数相同,都是两票,但是,YYS是1号,小马哥是6号,因此,YYS挂了;
又一轮天黑,WYH把胖子杀了,天亮的时候,英明神武的LY跟小马哥都投了WYH(再强调一次,他们是随机投票的!),不用说了,WYH2票必须出局,平民胜利!
好了,未来的ACMER,现在你需要设计一个程序,要求是这样的:给出游戏人数,游戏轮数,接着再给出每一轮里面,天黑的时候谁死了,天亮的时候,
他们分别投票投了谁,最后是狼人胜利还是平民胜利。你根据这些条件,判断出有多少人可能是狼人。这题很简单,相信难不倒你!



输入格式

第一行输入一个数T(T<=100),表示CASE数,第二行,两个数n(2<=n<=1000),k(1<=k<n),分别表示游戏人数和游戏轮数,
注意,参与游戏的人员的编号是1到n,接着,有k行,每行第一个数x,表示天黑的时候,x被狼人杀死了,后面紧跟n个数,
分别代表n个人这一轮投票投了谁(编号),-1则表示该人已死,无投票权利,当然,最后一轮的时候,可能出现天黑狼人杀人后,
游戏直接结束了,那么,天亮的投票阶段则用n个0代替。最后一行,是字符串,“haha”表示狼人胜利,“hehe”表示平民胜利。


输出格式

每组数据输出一行,一个数res(res>0),表示有多少人可能是狼人。


输入样例

1
6 2
4 6 6 1 -1 3 1
5 -1 3 2 -1 -1 2
hehe


输出样例

2
思路:这道题不难,不过确实挺繁琐的,如果考虑不周就会无限wa……简单说一下思路吧。如果狼人赢,那么最后死的人一定是平民,如果平民赢,那么最后死的人一定是狼人!无论怎样,我们都可以确定至少一个编号是狼人,对吧!!?(是的),然后我们把前几轮那些跟这个一定是狼人的编号的投票结果对比,不相同就说明不是狼人,如果都相同,证明可能是狼人!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int voteid[1005][1005];//用二维数据记录第k轮投票n个人的投票情况
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
 
        int n,x,res=0,i,j,k,people=0,max=0,wolf=0,judge[1005],lastdie,book[1005],t,mustwolfid,fredie;
        char result[10];
        scanf("%d%d",&n,&k);
        for(i=1;i<=n;i++)
                {
                        judge[i]=1;book[i]=0;
                }
        for(i=1;i<=k;i++)
        {
                scanf("%d",&x);
                judge[x]=0;
                for(j=1;j<=n;j++)
                        {
                                scanf("%d",&voteid[i][j]);
                        }
                lastdie=x;
        }
        scanf("%s",result);
        if(strcmp(result,"hehe")==0)//判断谁赢了比赛
                        people=1;
        else if(strcmp(result,"haha")==0)
                        wolf=1;
        if(voteid[k][1]!=0)//正常情况,天光时结束游戏,分析最后那轮
                {
                        for(i=1;i<=n;i++)//找出最后一轮投票谁死了,如果结果是平民赢,死那个必定狼人,否则死那个是平民
                        {//用book来记录每个人被投票的票数
                                t=voteid[k][i];
                                if(t>0)
                                {
                                        book[t]++;

                                if(book[t]>max)
                                {
                                        lastdie=t;
                                        max=book[t];
                                }
                                else if(book[t]==max&&book[t]>0)//票数相同,我们就取编号小的
                                {
                                        if(t<lastdie)
                                                lastdie=t;
                                }
                                }
                        }

                        if(wolf==1)//狼人赢了,排除最后死那个人是狼人的可能
                                {
                                        judge[lastdie]=0;
                                for(i=1;i<=n;i++)
                        {
                                if(voteid[k][i]>0&&i!=lastdie)
                        {
                                        mustwolfid=i;//找出一定是狼人的编号
                                        break;
                        }
                        }
                                }
                        if(people==1)//平民赢了,排除剩下的那些人狼人的可能
                        {
                                for(i=1;i<=n;i++)
                                {
                                        if(voteid[k][i]>0&&i!=lastdie)
                                        {
                                                judge[i]=0;
                                        }
                                }
                                mustwolfid=lastdie;//同上
                        }

                }
                else//如果天黑就结束,狼人赢
                {
                        max=0;
                        memset(book,0,sizeof(book));
                          for(i=1;i<=n;i++)//找出倒数第二轮投票谁死了
                        {
                                t=voteid[k-1][i];
                                if(t>0)
                                {
                                        book[t]++;

                                 if(book[t]>max)
                                {
                                        fredie=t;
                                        max=book[t];
                                }
                                else if(book[t]==max&&book[t]>0)
                                {
                                        if(t<fredie)
                                                fredie=t;
                                }
                                }
                        }
                        for(i=1;i<=n;i++)
                        {
                                if(voteid[k-1][i]>0&&i!=lastdie&&i!=fredie)
                        {
                                mustwolfid=i;
                                break;
                        }

                        }
                }
                        for(i=1;i<k;i++)
                        {//将每轮与真狼人投票不相同的假狼人排除
                                for(j=1;j<=n;j++)
                                {
                                        if(judge[j]==1&&voteid[i][j]!=voteid[i][mustwolfid]&&voteid[i][j]>0)
                                        {
                                                judge[j]=0;
                                        }
                                }
                        }
                        for(i=1;i<=n;i++)//统计狼人数目
                        {
                                if(judge[i]==1)
                                        res++;
                        }
                        printf("%d\n",res);
    }
    return 0;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值