給定一張迷宮地圖和乙個迷宮入口,和出口 找到一條可以通過的道路
我們使用乙個二維陣列代表迷宮,其中
gowithdynamic方法 根據當前點和終點的位置進行動態判定4個方向的優先順序,但是針對於很多障礙物的地圖,它表現的並沒有想象中那麼好,甚至有點差
完整**
public
class
maze
private
void
initmap
(int row,
int col)
for(
int i =
0; i < row; i++)}
/** * 設定柵欄
*/public maze setbarrier
(int row,
int col)
public
void
print()
system.out.
print
("\n");
}}public maze start
(int row,
int col)
// 起點預設走了
map[row]
[col]=2
; cur =
newint
;return
this;}
/** * 設定終點
*/public maze end
(int row,
int col)
end =
newint
; map[row]
[col]=9
;return
this;}
/** * 開始執行
*/public
voidgo(
int gomode)
else
if(gomode ==2)
else
if(gomode ==3)
if(!result)
else
}// 列印
print()
;// 繼續往下走
if(map[cur[0]
][cur[1]
]!=9)
else);
system.out.
println
("抵達終點...共執行:"
+ count +
"次,實際路徑長度:"
+ track.
size()
);// 列印軌跡
stringbuilder resulttrack =
newstringbuilder()
;while
(!track.
isempty()
) resulttrack.
("開始");
system.out.
println
(resulttrack);}
}/**
* 順時針的走 上右下左
*/private
boolean
gowithclockwise()
);}/**
* 逆時針走 下 右 上 左
*/private
boolean
gowithanticlockwise()
);}/**
* 根據當前的位置和終點的位置 動態計算4個方向的順序
* 每次都會重新計算該怎麼走
** @return
*/private
boolean
gowithdynamic()
;}else;}
}else;}
else;}
}return
goto
(dir);}
/** * 按照指定順序前往下乙個點
** @param dir 1 2 3 4 上右下左
* @return
*/private
boolean
goto
(int
dir)
else
if(dir[i]==2
)else
if(dir[i]==3
)else
if(result)
}return result;
}/**
* 去下乙個可達的點
*/private
boolean
goto
(int rowoffset,
int coloffset)
else
if(map[row]
[col]==0
)if(cango));
// 將下乙個點的座標作為新的位置
cur[0]
= row;
cur[1]
= col;
}return cango;
}public
static
void
main
(string[
] args)
}
使用遞迴需要遵守的重要守則
總結回溯其實就是將每一步有效的操作都壓入乙個棧中,然後通過出棧和入棧實現對操作的撤銷和重新執行。所以redo和undo 可以通過2個棧實現。基礎知識還是很重要的,環環相扣,前面學習的陣列可以作為佇列的基石,陣列和鍊錶又可以用來實現棧,緊接著 棧又可以用來實現回溯演算法。
所以以前跳過這些基礎知識 直接看樹,搞不懂是有道理的 。
資料結構學習筆記 遞迴
遞迴 乙個函式自己直接或間接呼叫自己。函式的呼叫 當在乙個函式的執行期間呼叫另乙個函式時,在執行被調函式之前,系統需要完成三間事 1 將所有的實際引數 返回位址 當被調函式完成後,接下來要執行的語句的位址 等資訊傳遞給被呼叫函式儲存。2 為被調函式的區域性變數 也包括形參 分配儲存空間。3 將控制轉...
資料結構學習記錄 迷宮設計
迷宮程式設計是第三個實驗,思想是不停的試探,然後標記判斷出路的過程 一般自己習慣把頭檔案全部放在乙個檔案裡名為t11.h include stdio.h include string.h include ctype.h include malloc.h include stdlib.h atoi e...
資料結構學習6 使用遞迴解決8皇后問題
public class queue8 public voidgo int num for int i 0 i 8 i 如果衝突將本行皇后後移乙個位置 public boolean judge int num return true public void print 檢查 這個點是否滿足要求 假定...