下面是一些雜感,可以幫助你安排的事情:
在C/C++二維數組是一個真正的一維結構(連續內存塊)。在C和C++中,二維數組存儲在行主要的窗體中,這意味着我們將整個第一行放在內存中,然後整個第二行等等。因此,例如,如果我們有以下 2-d陣列
0 1 2 <--- columns
0 a b c
1 d e f
2 g h i
^
+-- rows
,將在存儲器(假設我們使用炭作爲我們的基本數據類型),其表示:
+---+---+---+---+---+---+---+---+---+
| a | b | c | d | e | f | g | h | i |
+---+---+---+---+---+---+---+---+---+
這種安排很有用,因爲我們可以很容易地在一維存儲器陣列中的索引與我們的二維數組的概念之間進行轉換。在下面的等式中,R表示在我們的2-D數組中的最大行數(在這個例子中是3),並且C表示在我們的2-D數組中的最大列數(在這個例子中再次是3)。最後說明,我們對行和列使用零基數;因此元素'a'在行0,列0,在下面縮寫爲[0,0]。
所以如果我們對[r,c]中的內容感興趣,我們需要生成一個索引,n,via;
n = r * C + c
例如,如果我們感興趣的是[1,1],我們將計算:
n = 1 * 3 + 1 = 4
換句話說
,在[1,1]位於第四索引處的元素(再次記住該數組是從零開始的)。
我們也可以通過使用從索引n轉換回行列表示法;
r = n/C and c = n % C
例如在第六存儲器位置的元件(索引= 5)將是
r = 5/3 and c = 5 % 3 or [1,2]
樹放置是相當直截了當的,因爲如果我們正在處理焦慮數組,然後我們知道我們的索引從[0,n $^2 $ -1]開始運行,所以我們只是在該範圍內生成隨機數,只是確保不要使用相同的數字兩次。一些僞代碼可能會安排牛逼樹:
// assume that our game board is in a data-structure called `world'
len <- n*n; // maximum number in our range
trees <- t; // number of trees to place
do
ndx <- rand() % len // generate random number in range [0,len-1]
if (world[ndx] == 0) // picked an empty space
world[ndx] = 8; // plant a tree
trees -= 1; // decrement tree's remaining
while (trees > 0);
哪裏可能把帳篷很容易爲好。即將內存模型的2-d陣列之間的關係的思考,如果一棵樹位於定索引處,NDX,可能10噸位置的名單是:
L = ndx - 1; // this is due left of the tree
R = ndx + 1; // this is due right of the tree
B = ndx + C; // this is below the tree
A = ndx - C; // this is above the tree
當然,我們必須確保我們不會離開世界。就個人而言,我會將它們存儲在一個數組中,而不是四個變量。
帳篷約束實際上只是說明在八個相鄰單元中的任何一箇中都不能有帳篷。考慮下圖,我們在單元格中標有一個帳篷。如果這個單元格的索引是n,那麼周圍的單元格會顯示我們需要檢查的索引。
+---+---------+-----+----------+---+
| | | | | |
+---+---------+-----+----------+---+
| | n-C - 1 | n-C | n-C + 1 | |
+---+---------+-----+----------+---+
| | n-1 | T | n +1 | |
+---+---------+-----+----------+---+
| | n+C -1 | n+C | n+C +1 | |
+---+---------+-----+----------+---+
讓我們把3和4放在一起。我們首先創建一個函數placeTents
,它獲取樹木放置位置的索引數組。這是一個簡單的函數,只要它的任何位置超出邊界,我們就會在{top,left,right,bottom}的順序中創建一個潛在樹位置數組,我們在數組中設置一個負值。最後,我們嘗試爲函數placeTent(P)中的帳篷生成 的可行位置;如果placeTent失敗,我們不能滿足約束,從您的問題描述,它是在你想在這一點上做什麼不清楚,這個討論中,我只是指出該方案
placeTents(trees):
max <- R * C -1 // max index
for each tree in trees
if (tree - C) > 0 then P[0] = tree - C else P[0] = -1;
if (tree - 1) > 0 then P[1] = tree - 1 else P[1] = -1;
if (tree + 1) < max then P[2] = tree + 1 else P[2] = -1;
if (tree + C) < max then P[3] = tree + C else P[3] = -1;
if (!placeTent(P))
exitError;
的出口對於placeTent,我們需要檢查所有八鄰居(可能不存在),爲了簡單起見,我們只在第一個可用位置放置一個帳篷。再次記住,placeTent接受可能放置帳篷的地方列表,然後檢查每個地點的可行性。同樣,我們認爲遊戲板是在一個名爲world
bool placeTent(P)
ret <- false;
max <- R * C - 1;
for each loc in P
if loc == -1 continue;
// calculate indexes we want to look at....
trial[0] <- loc - Col - 1;
trial[1] <- loc - Col;
.....
trial[6] <- loc + Col;
trial[7] <- loc + Col + 1;
for each t in trial
if ((t < 0) || (t > max)) continue; // we fell of the world.....splat!
if (world[t] == 0)
world[t] = 4;
return true;
return false; // failed to find a place to pitch our tent
最後,真正的挑戰是找到帳篷可行的位置的陣列,爲了這個,我倒是對遞歸的事情,所以,當我失敗找到一個可行的位置,我們可以放鬆地點,並嘗試不同的路徑。
而且看到了這個旋轉成的長度....對不起,可能是漫無邊途的方式,太多了......我將在稍後離開遞歸部分。
編輯/添加:
一個我忘了提及其他的東西,上面是非常確定的,即我們可以嘗試把一棵樹上面一頂帳篷,然後移動逆時針旋轉。在某些時候,人們會弄清楚這一點,所以你可能想隨機選擇要檢查的地方的順序(即在每個樹的P數組上創建一個排列)。
你已經有什麼代碼了?如果你還沒有任何實際的代碼,可能是一些關於你如何解決問題的僞代碼? – kevinsa5 2014-12-07 05:15:23