PHP 求解:2006年百度之星程序设计大赛复赛题目:另类杀人游戏

 

 

 

 

 

 

 

 

 

 

 

2006年百度之星程序设计大赛试题复赛题目

 

另类杀人游戏

周末的晚上,百度的员工们总喜欢聚集在公司的会议室玩杀人游戏。从 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 是你要选择的位置。

 

 

 

基本做法:保留人名和初始的位置,放到数组,数组每次不断减1人,由于记录了初始的位置和人名,而处理的知识当前没有被排除的人变化

,以达到输出杀人顺序,每次杀人者位置,路过在被杀者右边,则杀人者在后一轮中位置前移1位,以比较状态

 

测试:可以输出正确结果,输出路下: kill顺序:4,2,7,6,3,5----人:ab,小李,hh,haoli,小hua,bbf

 

 

下面是PHP代码,设置的初始量杀人者位置1,7个人游戏,最后被杀的人即为警察位置

<?php
//间隔相等步去人
$ren=array('小明','小李','小hua','ab','bbf','haoli','hh');//游戏成员
//$ren=array('1','2','3','4','5','6','7');
//确定killer的位置
$killwz=1;//kill位置
for($i=0;$i<count($ren);$i++){
if(($i+1)==$killwz){
$killname=$ren[$i];
break;
}

}//由位置得到kill名字,根据名字判断

//echo $killwz;
$wz=1;
$tren=array();
$buchang=4;//步长
$jishu=1;
$sequstr1='';
$step=1;
$sequstr2='';

for($i=0;$i<count($ren);$i++){
$t=array($i+1,$ren[$i]);
$tren[]=$t;
}

while(count($tren)>1){

//由数数开始位置确定舍弃位置
$renshu=count($tren);

if(($wz+$buchang-1)<=$renshu)$sequwz=$wz+$buchang-1;

else{ if(($wz+$buchang-1)%$renshu==0)$sequwz=$renshu;
else $sequwz=($wz+$buchang-1)%$renshu;

 

 
}
//echo $sequwz;

//路过这个舍弃位置是kill,那么舍弃kill的后一个
if($sequwz==$killwz){
if($sequwz==$renshu)$sequwz=1;

else $sequwz=$sequwz+1;

}//end if($tren[$sequwz-1]=='kill'

//echo $sequwz;

if($jishu==1){$sequstr1.=$tren[$sequwz-1][1];
$sequstr2.=$tren[$sequwz-1][0];
}

else{ $sequstr1.=','.$tren[$sequwz-1][1];
$sequstr2.=','.$tren[$sequwz-1][0];
}

//减人同时设置下一个数数位置

if($sequwz==$renshu)$wz=1;

else $wz=$sequwz;

if($sequwz<$killwz)$killwz=$killwz-1;//路过大于舍弃位置,kill位置前移1位

//重新生成游戏成员数组
$arr=array();
for($i=0;$i<count($tren);$i++){
if(($i+1)!=$sequwz)$arr[]=$tren[$i];

}
$tren=$arr;

$jishu++;

}//end while

//echo '最后得到的kill顺序和人:';
//print_r($tren);
echo 'kill顺序:'.$sequstr2.'----人:'.$sequstr1;

 

 

?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值