首先:這不是一項家庭作業,它是我的一個愛好項目。簡單遞歸算法中終止路徑的問題
背景: 對於我的Java益智遊戲,我用一個很簡單的遞歸算法,如果一定空間,以檢查的「地圖」已經成爲孤立的一塊放置後。在這種情況下分離的意思是:在沒有片可以放置在
當前算法:
public int isolatedSpace(Tile currentTile, int currentSpace){
if(currentTile != null){
if(currentTile.isOpen()){
currentTile.flag(); // mark as visited
currentSpace += 1;
currentSpace = isolatedSpace(currentTile.rightNeighbor(),currentSpace);
currentSpace = isolatedSpace(currentTile.underNeighbor(),currentSpace);
currentSpace = isolatedSpace(currentTile.leftNeighbor(),currentSpace);
currentSpace = isolatedSpace(currentTile.upperNeighbor(),currentSpace);
if(currentSpace < 3){currentTile.markAsIsolated();} // <-- the problem
}
}
return currentSpace;
}
這段代碼返回空空間,其中起始瓦是其一部分的尺寸。這部分代碼的工作原理如圖所示。但是我碰到關於瓷磚的標誌,這是什麼使有關這個問題的標題一個問題就來了;)
問題: 的問題是,某些瓷磚從未「重新」(他們返回值和終止,所以從未從後來的化身中獲得返回值來更新空白空間的大小)。這些「被遺忘」的瓷磚可以是大空間的一部分,但仍然被標記爲孤立的,因爲在當前空間具有較低值時在開始處訪問它們。
問題: 如何改善這段代碼,使它爲瓷磚設置正確的值,而沒有太多的開銷?我可以想到醜陋的解決方案,如重新訪問所有標記的瓦片,以及它們是否具有適當的值,檢查鄰居是否具有相同的值,如果不更新等。但我確信有堆棧溢出的人們有更好的想法; )
更新: 我已經做了一些改動。
public int isolatedSpace(Tile currentTile, int currentSpace, LinkedList<Tile> visitedTiles){
if(currentTile != null){
if(currentTile.isOpen()){
// do the same as before
visitedTiles.add();
}
}
return currentSpace;
}
而且marktiles功能(僅調用時返回spacesize比給定值小)
marktiles(visitedTiles){
for(Tile t : visitedTiles){
t.markAsIsolated();
}
}
這種做法與雷克斯克爾的答案線,至少如果我明白了他的理念。
另一方面,我想指出的是,根據所涉及的特定部分,即使大面積的形狀不佳,也可能是「孤立的」。例如,如果您沒有線性部分,則無法填充20個空格的線。如果那麼重要,你可能不得不下放試圖將每件作品放在每個位置/方向;標記任何有效位置覆蓋的方塊,然後完成標記反轉以獲得無用空間。 – 2010-08-20 15:44:56