我想實現洪水填充算法的一個版本來幫助解決微型鼠標迷宮的最短距離路徑。除了每個相鄰的非填充地點將被分配一個代表該地點到出發地的距離的數字之外,其工作方式與常規填充填充相同。每次算法移動到不同的單元格時,數字都會加1。這裏是一個沒有從左下角開始的迷宮的例子。洪水填充算法 - 迷宮導航
2 3 4
1 2 3
0 1 2
下面是當前代碼我有...
void nav_flood_rec(struct nav_array *array, int row, int column, int flood_num)
{
//Check the base case (not shown here)
if (base_case)
return;
//Assign the flood number
arrray->cells[row][column]->flood_number = flood_num;
//North
nav_flood_rec(array, row + 1, column, flood_num + 1);
//East
nav_flood_rec(array, row, column + 1, flood_num + 1);
//South
nav_flood_rec(array, row - 1, column, flood_num + 1);
//West
nav_flood_rec(array, row, column - 1, flood_num + 1);
}
是我遇到的問題是,遞歸是不是在一個時間前進了一大步(有點含糊,但讓我解釋一下)。而不是檢查所有方向,然後移動算法將繼續向北移動而不檢查其他方向。似乎我想讓其他遞歸調用以某種方式產生,直到檢查其他方向。有沒有人有什麼建議?
+1這聽起來和BFS完全一樣。一個隊列將解決堆棧溢出問題,但它不會解決非終止循環。處理過的單元需要這樣標記。 –
哦,我看到我出錯的地方。唯一的問題是這是在微處理器上,並且只有內存堆棧(沒有動態內存),這意味着沒有malloc()。我可以用一個數組來實現一個隊列,但是這看起來效率很低。 –
@StefanBossbaly如果你知道隊列中最多有多少元素,你可以非常有效地做到這一點。分配一個數組,保留一個'front'和''length'計數器,每次移除一個物品時增加'front'計數器並減少'length'計數器,每次放入物品時增加'length'計數器隊列。這兩個增量都是模數組的大小。 'front'計數器告訴你下一個要處理的元素在哪裏,'length'計數器告訴你隊列中有多少個元素。關於你的堆棧溢出問題,你需要標記單元格。 –