日期:2014-05-19  浏览次数:20691 次

100分求一算法
杀人游戏
N个人坐成一圈玩杀人游戏,按顺时针编号   1   2   3   4   ...   ...    
从1号开始顺时针开始数到第m号就杀掉第一个人,被杀掉的人要退出游戏。    
如果数到了编号的末尾,就逆时针方向继续数,如果又数到了编号的开头,就恢复顺时针继续。    
重复,直至杀掉所有人,当剩下最后一个人时,游戏结束,聪明的你能告诉我活到最后的幸存者最初的编号是多少吗?

输入数据:N、M

输出数据:幸存者的编号  

考核标准:技术语言不限,程序输出结果必须正确,内存使用越少越好,程序的执行时间越快越好。




------解决方案--------------------
另类杀人游戏


周末的晚上,百度的员工们总喜欢聚集在公司的会议室玩杀人游戏。从1警1匪到n警n匪,他们尝试了几乎所有流行的杀人游戏规则。终于有一天,连最热衷杀人游戏,“杀人”不眨眼的Austin也开始对无休止的辩论感到厌烦。于是,他决定改变他的一贯作风,他开始变成了一个“杀人不睁眼”的杀手。


如何做到杀人不睁眼呢?Austin早已构思好他的杀人计划:

1. N个人(包括Austin)坐成一圈玩杀人游戏,按顺时针编号1,2,3,4。。。。。

2. Austin从1号开始顺时针开始数到第m号就杀掉第一个人。被杀掉的人要退出游戏。

3. 如果第m个人恰好是Austin自己,他就杀掉他顺时针方向的下一个人。

4. Austin从被杀的人的下一个顺时针数m个人,把第m个杀掉。

5. 重复2-4,直至杀掉所有人。


Austin把这个杀人计谋告诉了法官小k,他便可以闭起眼睛杀人啦。作为一个正直善良的法官,小k当然不能让残忍的Austin得逞,于是,她偷偷把Austin的杀人计划告诉了作为警察的你,聪明的百度之星。现在,你的任务是活到最后,与Austin单挑。


输入:

第一个行包含一个整数T,表示有T组测试数据。


对于每组测试数据:

三个整数

N,M,T,(3 <=N <=10000,1 <=M,T <=10000) 分别表示参与游戏的人数,Austin每隔M个人会杀掉一人,Austin初始位置的标号。


输出:

每个测数数据输出一个整数。

你需要选择的初始位置的序号,以确保最后剩下的两个人是你与Austin。


输入例子:

2

7 4 1

7 4 1


输出例子

5

5


例子说明:杀人顺序为4 2 7 6 3 5 , 所以5 是你要选择的位置。

------解决方案--------------------
难度不大咯~!但是还是写了半小时:)

using System;
using System.Collections.Generic;
using System.Text;

namespace 杀人者游戏
{
class Program
{
static void Main(string[] args)
{
/*杀人游戏N个人坐成一圈玩杀人游戏,按顺时针编号 1 2 3 4 ... ...
*
* 从1号开始顺时针开始数到第m号就杀掉第一个人,被杀掉的人要退出游戏。
*
* 如果数到了编号的末尾,就逆时针方向继续数,如果又数到了编号的开头,就恢复顺时针继续。
*
* 重复,直至杀掉所有人,当剩下最后一个人时,游戏结束,
*
* 聪明的你能告诉我活到最后的幸存者最初的编号是多少吗?

输入数据:N、M

输出数据:幸存者的编号 */


int N = Convert.ToInt16(Console.ReadLine()); //N

bool [] p=new bool [N]; //建立一个BOOL数组,如果为FALSE,则证明此位的人存活,否则则以.

bool fx = false; //判断逆时针还是顺时针;

int M = Convert.ToInt16(Console.ReadLine());

int num = 1;//记录指针
int js = 1;//总计数,一下循环运行多少次

while (true)
{
if (isok(p))//如果OK
{
if (js % M == 0 && !p[num - 1])
{
p[num - 1] = true;
Console.WriteLine( "本次出圈人编号: " + (num - 1).ToString());
}
if (num == N || num == 1) fx = !fx;
if (fx)
{

num++;
while (p[num - 1] && num < N)
{
num++;
}
js++;
}
else
{
num--;
while (p[num - 1] && num> 1)
{
num--;