变态杀人狂

来源:互联网 发布:java包的作用 编辑:程序博客网 时间:2024/04/25 11:56

变态杀人狂

时间限制: 1 Sec  内存限制: 128 MB
提交: 26  解决: 16
[提交][状态][讨论版]

题目描述

变态杀人狂三师弟想到一个杀人游戏
游戏规则如下:
三师弟抓了n个人
对这n个人进行编号,分别从1到n,排成一个圈,顺时针从1开始数到m,数到m的人被杀,剩下的人继续游戏,活到最后的一个人是胜利者。请输出每次被杀的人的编号
注意最后一个活着的人不用输出

输入

多组测试数据,输入n和m值。1<n,m<200,EOF结束

输出

输出每次被杀的人的编号 注意 最后一个人不用输出

样例输入

5 3

样例输出

3152

解题思路

此题运用模拟的想法,最开始的时候,本来算用一个回环来控制,但是很麻烦,后来发现由于外层用个永久循环,当杀到n个人时退出循环比较方便,再有就是用一个标记数组来表示此人是否被杀。

解题代码

#include<iostream>

#include<stdio.h>

#include<string.h>
using namespace std;
int main()
{
    int n,m;
    int vis[205];
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(int i=1;i<=n;i++)  //0表示没有被杀,初始时标记所有人都未被杀
            vis[i]=0;
        int j=0;
        int k=0;
        while(1)  //永久循环
        {
            for(int i=1;i<=n;i++)
            {
                if(vis[i]==0) 
                {
                    j++;
                    if(j==m)  //当点到第m个人时 杀掉他
                    {
                        vis[i]=1; //标记为1
                        j=0;  //重新开始数
                        k++;//k表示杀的第k个人
                        if(k!=n)  //前n-1个人要输出
                        printf("%d\n",i);
                    }
                }


            }
            if(k==n)  //当 杀到最后一个人时退出循环
                break;
        }
    }
    return 0;
}

1 0
原创粉丝点击