关闭

17228 真.狼人游戏[C]

标签: ICPC算法C17228真.狼人游戏
528人阅读 评论(0) 收藏 举报
分类:

17228 真.狼人游戏

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

题型: 编程题   语言: C++;C

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


来源

胖子

作者

201130740419


思路:根据最后一行字符串可分3种情况

平民胜利:获取最后被投票投死的狼人下标;

狼人胜利且最后一行全零:获取非投票投死也非最后被狼人杀死的下标,既狼人下标;

狼人胜利且最后一行非零:获取非投票死的下标,既狼人下标;

再根据一下步骤排除:排除狼人杀死的->排除狼人投票的->排除与狼人不同投票的。

以下是我用的测试例子:

5
6 2
1 -1 3 2 2 2 2
3 -1 -1 -1 5 4 4
haha

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

6 3
4 6 6 1 -1 6 3
5 3 3 2 -1 -1 -1
1 0 0 0 0 0 0
haha

6 3
4 3 1 1 -1 3 5
6 -1 3 5 -1 2 -1
5 0 0 0 0 0 0
haha

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

【注】听哥一句劝,这道题不要做,BUG太多。

你会发现不判断与狼人投票不同的假狼人也可以通过,如下测试例子:

1

6 3
4 3 1 1 -1 3 5
6 -1 3 5 -1 2 -1
5 0 0 0 0 0 0
haha


代码


#include <stdio.h>
#include <string.h>

const int maxn=1010;
int a[maxn][maxn];

int main()
{
    int T,n,k,i,j,wolf[maxn],id,b[maxn],max,count;
    char s[10];
//    freopen("input.txt","r",stdin);
    scanf("%d",&T);
    while(T--)
    {
        memset(wolf,0,sizeof(wolf));
        scanf("%d%d",&n,&k);
        for(i=0;i<k;i++)
        {
            for(j=0;j<=n;j++)
            {
                scanf("%d",&a[i][j]);
            }
        }
        scanf("%s",s);
        id=1;
        memset(b,0,sizeof(b));
        if(0==strcmp(s,"haha"))
        {
            if(0==a[k-1][1])//狼人赢且出现最后全零的情况
            {
                for(i=1;i<=n;i++)//统计投票数
                {
                    if(-1!=a[k-2][i])
                    {
                        b[a[k-2][i]]++;
                    }
                }
                for(i=1,max=1;i<=n;i++)
                {
                    if(b[max]<b[i])
                    {
                        max=i;
                    }
                    else
                    {
                        if(b[max]==b[i]&&max<i)//投票相等但下标小的
                        {
                            max=i;
                        }
                    }
                }
                for(j=1;j<=n;j++)
                {
                    if(max==a[k-2][j]&&j!=a[k-1][0])
                    {
                        id=j;//其中一个狼人下标
                        break;
                    }
                }
            }
            else
            {
                for(i=1;i<=n;i++)
                {
                    if(-1!=a[k-1][i])
                    {
                        b[a[k-1][i]]++;
                    }
                }
                for(i=1,max=1;i<=n;i++)
                {
                    if(b[max]<b[i])
                    {
                        max=i;
                    }
                    else
                    {
                        if(b[max]==b[i]&&max<i)
                        {
                            max=i;
                        }
                    }
                }
                for(j=1;j<=n;j++)
                {
                    if(max==a[k-1][j])
                    {
                        id=j;
                        break;
                    }
                }
            }
        }
        else
        {
            for(i=1;i<=n;i++)
            {
                if(-1!=a[k-1][i])
                {
                    b[a[k-1][i]]++;
                }
            }
            for(i=1,max=1;i<=n;i++)
            {
                if(b[max]<b[i])
                {
                    max=i;
                }
                    else
                    {
                        if(b[max]==b[i]&&max<i)
                        {
                            max=i;
                        }
                    }
            }
            id=max;
			for(int i = 1; i <= n; i++) if(a[k-1][i] != -1&&i!=max) wolf[i] = -1;//不加这一句过不了,醉了醉了
        }
        for(i=0;i<k;i++)//排除狼人杀死的平民
        {
            wolf[a[i][0]]=-1;
        }
        for(i=0;i<k;i++)//排除狼人投票的平民
        {
            wolf[a[i][id]]=-1;
        }
        for(i=0;i<k;i++)//排除与狼人投票不同的平民,这个判断不加也过得了,醉了醉了
        {
            for(j=1;j<=n;j++)
            {
                if(-1!=a[i][j]&&a[i][j]!=a[i][id])
                {
                    wolf[j]=-1;
                }
            }
        }
        for(i=1,count=0;i<=n;i++)
        {
            if(-1!=wolf[i])
            {
                count++;
            }
        }
        printf("%d\n",count);
    }
    return 0;
}


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

狼人杀总结之“警下预言家 必是真预言家”

警下预言家必是真预言家
  • opooc
  • opooc
  • 2017-04-14 16:26
  • 4284

C#游戏开发之炸弹人游戏开发

笔者第一次发表文章,考虑不全多多包涵。也想借此机会和大家交流游戏开发。希望大神能指点一二。笔者是利用VS2010编译器,下面进入正题: 利用C#控件来实现2D游戏开发还是比较方便。先从总体上介绍炸弹人...
  • xty13145588950
  • xty13145588950
  • 2016-07-21 22:02
  • 1293

Unity3D游戏开发-模仿项目一 第一人称角色射击(有源代码)

第一人称射击类游戏,FPS(First-person Shooter), 严格来说第一人称射击游戏属于ACT类游戏的一个分支,但和RTS类游戏一样,由于其在世界上的迅速风靡,使之发展成了一个单独的类型...
  • heyuchang666
  • heyuchang666
  • 2015-06-06 23:02
  • 5641

17228 真.狼人游戏

17228 真.狼人游戏 时间限制:1000MS  内存限制:65535K 提交次数:29 通过次数:3 收入:158 题型: 编程题   语言: G++;GCC Description...
  • SCAU_BIN
  • SCAU_BIN
  • 2016-02-01 01:10
  • 352

17225 狼人游戏[C]

狼人游戏是一款深受大众欢迎的桌游。Ly作为初学者,自然也迷上这款刺激与智商并存的游戏。 可是有一件很忧伤的事,大家都知道狼人的角色牌分为狼人和非狼人,然后Ly经常玩一个晚上都抽不到狼人的角色。 为了...
  • u011875552
  • u011875552
  • 2015-04-03 16:04
  • 594

狼人杀游戏源码

  • 2017-10-30 20:43
  • 34.25MB
  • 下载

不说话的“狼人杀”游戏

“狼人杀”游戏,是一种流行的卡牌游戏。这个游戏有若干张牌,每张牌上写着“狼人”,“村民”(有些复杂的玩法,还带有“女巫”,“预言家”等特殊角色)。牌的数目大于参与游戏的人数。通常的玩法是,一个人扮演法...
  • larryliuxinyu
  • larryliuxinyu
  • 2016-06-07 10:24
  • 2417

基于C#制作的狼人游戏介绍

ps:如果你觉得:C语言还看不明白呢,还看C#。那就错了,熟悉这个游戏的人都知道这是一个过程性的游戏,所以我的核心代码也是采用面向过程(与C一致)来写的,在C#的特殊之处我也会特别说
  • Xiaolu_Yiren
  • Xiaolu_Yiren
  • 2017-07-03 18:16
  • 300

c++ 实现狼人游戏

题目Task实现一个简单的“狼人游戏”通知机制Details角色有:村民,狼人,预言家,女巫,猎人(Uninitialized只用于默认构造函数) 法官呼叫“狼人/预言家/女巫/猎人”,相应角色进行...
  • qq_36124194
  • qq_36124194
  • 2017-06-01 13:34
  • 330

(狼人杀)游戏研究-Android

游戏中的功能研究:游戏的通信/充值/广告/分享 通信:环信 融云 SurfaceView 与 GLSurfaceView效率!   两款游戏引擎,一个是cocos2dx,另一款是andengine,其...
  • ShareUs
  • ShareUs
  • 2017-05-18 22:51
  • 830
    个人资料
    • 访问:10042次
    • 积分:265
    • 等级:
    • 排名:千里之外
    • 原创:17篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类
    文章存档
    最新评论