1. 程式人生 > >PHP 求解:2006年百度之星程式設計大賽複賽題目:另類殺人遊戲

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;

?>