17225 狼人游戏

17225 狼人游戏

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

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

Description

狼人游戏是一款深受大众欢迎的桌游。Ly作为初学者,自然也迷上这款刺激与智商并存的游戏。 可是有一件很忧伤的事,大家都知道狼人的角色牌分为狼人和非狼人,然后Ly经常玩一个晚上都抽不到狼人的角色。 为了抽到心爱的狼人,Ly开始观察主持人洗牌和发牌的规律。假设现在有n个人(分别编号1~n)玩游戏,也就是有n张牌,则主持人每一轮进行以下操作: 1.将手中的n张牌自顶到底编号1~n,并将它们从左到右放在反面放在桌面上; 2.记当前桌面剩下的牌里面,编号最小为m; 3.依此取编号为m,m+X,m+2*X....m+c*X的牌,直到m+c*X>n,每次取到的牌放到手牌的顶部; 4.如果桌面上还有牌,重复步骤2、3;否则洗牌完成,主持人重新将手牌自顶到底编号1~n; 5.游戏开始,主持人将第i张牌,发给编号为i的人; 6.游戏结束,主持人按游戏者编号回收角色牌,也就是第i个人的牌,放在第i位。 现在Ly知道自己的编号是k,还有就是在开局前,偷偷地把牌的初始状态记了下来,也就是说第一轮开始前第i张牌是不是狼人,Ly是知道的。游戏第一轮开始前主持人不洗牌。 由于大家今晚非常兴奋,打算玩通宵,你可以当作游戏进行了无数轮。Ly想知道他今晚有没有可能抽到狼人。但Ly正陶醉于游戏中,聪明的13级大神们,你可以帮Ly推测一下吗?O(∩_∩)O~


输入格式

第一行一个整数T(T<=20),表示测试数据的组数。
每组数据有两行。
第一行3个正整数n,X,k. n,X,k的含义如题目所述。
第二行一个长度为n的字符串,只由0和1组成。第i个字符代表初始状态下第i张牌的角色是不是狼人,1代表是,0代表不是。
数据范围:
3<=n<=1000
1<=k<=n
1<=X<=1000007



输出格式

每组数据输出一行。
如果Ly可以抽到狼人角色,输出”haha”;否则输出”hehe”。


输入样例

2
6 2 3
000010
6 2 1

000010

思路:我们可以注意到,其实每次变化,牌变化的位置都是有规律的,所有我们并不需要每次循环都去重复变化一次牌,只需要把牌每次变化的位置记录下来就可以了。

譬如:就第一个测试数据000010,我们记每个位置为0,1,2,3,4,5,按照题意我们变化牌的位置,变为5,3,1,4,2,0,即000100,然后我们每次都按照这个顺序变牌,changpai[i]=pai[position[i]];就行了


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,x,k,min=0,m,i,j,flag=0,leave;
        scanf("%d%d%d",&n,&x,&k);
        char pai[1001],changpai[1001];
        int book[n+1],position[n+1];
        memset(book,0,sizeof(book));
        scanf("%s",pai);
        leave=m=n;
        strcpy(changpai,pai);
        while(m>=0)//每次牌变化的位置都是一样的,我们记录下来。
                {
                for(i=min,j=1;i<n;i=min+j*x,j++)
                {
                        position[m-1]=i;
                        m--;
                        book[i]=1;
                }
                for(i=0;i<n;i++)
                {
                        if(book[i]==0)
                        {
                                min=i;
                                break;
                        }
                }
                }
        while(leave--)//leave次(n次)循环后,如果抽不到狼人就没办法抽到狼人了
        {
                min=0;
                m=n;
                if(changpai[k-1]=='1')
                {
                        printf("haha\n");
                        flag=1;//记录第k个牌是否等于1
                        break;
                }
                for(i=0;i<n;i++)
                {
                        changpai[i]=pai[position[i]];//我们把每个牌都变化一次
                }
                strcpy(pai,changpai);//pai==changpai

        }
        if(flag==0)
                printf("hehe\n");
    }
    return 0;
}


展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读