#UVa中文翻譯:114-Simulation Wizardry(模擬巫術)

灆洢 2014-08-15 01:01:27

背景

模擬(Simulation)是個在電腦科學中重要的應用領域,其可被用來開發觀察真實世界中所發生之事件的虛擬模型。模擬有很多不同種的型式,包含有離散事件的模擬型式以及時間驅動的模擬型式。當要設計一個實際可行的方法去近似觀察到的行為,通常可以利用模擬來設計。

這題包含了一個簡單的彈珠台的模擬。在一個彈珠台中,一個鋼球在平面上滾著並且撞到非常多的物體(緩衝器(bumpers)),然後不斷累積分數直到球從平面上”消失”。

問題

你要做的是去寫一支程式模擬一個理想的彈珠台。這個彈珠台有一個上面佈滿著障礙物(緩衝器以及牆壁)的平面,而這個平面可以用一個原點位於左下方的114img1棋盤格來表示,平面上的每個緩衝器皆位於此棋盤格的格點上,而棋盤格中位於平面的邊界上的位置所表示的則是牆壁。鋼球在某個時間點上只會被射出(出現)在棋盤格上一顆,並且會有此顆球所在的初始位置、發射方向以及存活時間的資訊可以取得。在這個模擬中,所有的位置皆用整數表示,而鋼球的方向會是上、下、左、右四個當中的其中一個。鋼球會因為撞上緩衝器(增加分數)或是牆壁(不會增加分數)而反彈來反彈去的,而撞到的緩衝器所得到的分數是由鋼球所撞到的那個緩衝器被定義的分數來決定,並且鋼球的速度為每一個時間區間移動一個格子。當在一個時間區間內鋼球要嘛是移動到緩衝器的上面不然就是牆壁的格點上時,我們就稱作鋼球”撞到了”障礙物;而每次的撞到會造成鋼球往右(順時針)轉90度的”反彈”,並且不會讓鋼球移動到障礙物的上面或是改變其位置(僅會改變鋼球的方向)。注意一點,這樣的定義並不會讓鋼球沿著牆壁滑行的行為構成”撞到”牆壁的這件事件發生。

一個鋼球的生存時間表示的是多少時間單位可以讓鋼球存在於平面上,當超過該時間單位後,鋼球就會從平面上消失。每當鋼球移動一步就會用掉生存時間的一個單位,並且當下一步會撞到緩衝器或是牆壁時會再多用掉一些鋼球的生存時間,而這個被多用掉的一些生存時間就被稱作是這個緩衝器或是牆壁的生存時間消耗量。當球撞到緩衝器前,若其生存時間尚未被消耗殆盡,不管扣掉緩衝器之生存時間消耗量後可生存之時間是否為非正整數,依然可以得到該緩衝器能給予的分數。要注意的一點是,當鋼球只剩下一個單位的生存時間,也就是說再走下一步時鋼球就會”死掉”的時候,若這最後的一次移動會撞到緩衝器的話並不會讓你得到任何的分數。當鋼球的生存時間為非正數時(小於或等於零),則該鋼球就會消失,輪到下一顆鋼球登場並繼續遊戲。

輸入

你的程式應該要模擬一場彈珠台遊戲。輸入會有很多行以用來描述這場遊戲。第一行會有以空白隔開的兩個整數m與n,這兩個數字描述著一個用來表示遊戲中被”玩著”的直角座標系棋盤格,其x介於1到m之間並且其y介於1到n之間(114img2114img3),而m與n的範圍分別是2 < m < 51且2 < n < 51。下一行則給予撞擊牆壁的生存時間消耗量。再下一行給予緩衝器的數量整數p,且114img4。接下來的p行,每一行給予各個緩衝器所在的x座標和y座標,以及撞擊其可得到的分數和其生存時間消耗量,這四個數值在每一行中用空白隔開。緩衝器之x座標與y座標會在此棋盤格的範圍內,可得之分數與生存時間消耗量可以是任意整數(例如:它們有可能是負數;負數的生存時間消耗量反而在鋼球撞擊時可以增加其生存時間)。剩下的行數是用來描述鋼球的部分,每一行用四個被空格隔開的整數去描述一顆鋼球,四個整數分別是:鋼球初始的x與y座標、鋼球行走之方向以及其可生存之時間。鋼球的位置會在棋盤格的範圍內(而且不會位在任何的緩衝器與牆壁上面),而其行走方向會是下面四個值的其中一個:0代表往正x方向行走(右)、1代表往正y方向行走(上)、2代表往負x方向行走(左)、3代表往負y方向行走(下)。最後,鋼球的生存時間則是一個正整數。

輸出

照著每一顆球在輸入被定義的順序,一行一行的輸出各個球個別的得分,並在最後輸出總共的成績。

範例輸入

4 4
0
2
2 2 1 0
3 3 1 0
2 3 1 1
2 3 1 2
2 3 1 3
2 3 1 4
2 3 1 5

範例輸出

0
0
1
2
2
5

翻譯:灆洢。若翻譯有任何錯誤,歡迎底下留言告知,感謝!

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料