PHP 求解:2006年百度之星程式設計大賽複賽題目:另類殺人遊戲
2006年百度之星程式設計大賽試題複賽題目
另類殺人遊戲
週末的晚上,百度的員工們總喜歡聚集在公司的會議室玩殺人遊戲。從 1 警 1 匪到 n 警 n 匪,他們嘗試了幾乎所有流行的殺人遊戲規則。終於有一天,連最熱衷殺人遊戲, “ 殺人 ” 不眨眼的 Austin 也開始對無休止的辯論感到厭煩。於是,他決定改變他的一貫作風,他開始變成了一個 “ 殺人不睜眼 ” 的殺手。
如何做到殺人不睜眼呢? Austin 早已構思好他的殺人計劃:
1 . N 個人(包括 Austin )坐成一圈玩殺人遊戲,按順時針編號 1 , 2 , 3 , 4 。。。。。
2 . Austin 從 1 號(初始
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;
?>