/*
目的:從左上角走到右下角。
地圖用陣列表示,0表示可走,1表示牆,2表示已走過(不能再走),3表示已走過但走不通。
策略:向下→向右→向上→向左
初始地圖:
1 1 1 1 1 1 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 1 1 0 1 0 1
1 0 0 1 0 0 1
1 0 0 0 0 0 1
1 0 0 0 0 0 1
1 1 1 1 1 1 1
執行結果:
1 1 1 1 1 1 1
1 2 0 0 0 0 1
1 2 2 2 2 2 1
1 1 1 3 1 2 1
1 0 0 1 0 2 1
1 0 0 0 0 2 1
1 0 0 0 0 2 1
1 1 1 1 1 1 1
*/public
class
migongdemo
for(
int i =
1; i <
7; i++
) map[3]
[1]=
1;map[3]
[2]=
1;map[3]
[4]=
1;map[4]
[3]=
1;system.out.
println
("初始地圖:");
for(
int i =
0; i <
8; i++
) system.out.
println()
;}system.out.
println
("執行結果:");
if(findway
(map,1,
1)) system.out.
println()
;}}else
}/**
* 首先將起始位置設為2,然後判斷向下能否走通,能走通(即等於0)會一直向下走,
* 直到向下的位置不等於0,比如說當i=2,j=1時,向下的位置的值為1,使用findway方法嘗試之後,
* 返回false,這樣就跳到第二個分支來判斷向右是否能走通,注意此時ij依然是i=2,j=1,使用這兩個值
* 繼續向右試探。以此類推,直到目的地。
* @param map 地圖
* @param i 起始位置(i, j)
* @param j
* @return 返回true表示找到
*/public
static
boolean
findway
(int
map,
int i,
int j)
else
elseif(
findway
(map, i, j+1)
)elseif(
findway
(map, i-
1, j)
)elseif(
findway
(map, i, j-1)
)else
}else}}
}
使用with遞迴回溯
向上回溯,查詢頂級部門 declare pdeptid uniqueidentifier with dept deptid,pdeptid as select udepid,uparentid from oa.dbo.depinfo where udepid in select p.udepid f...
遞迴回溯解決八皇后問題
問題引入 解決思路 先放置第乙個皇后在第一行遍歷,確定第乙個皇后的列,然後利用遞迴放置下乙個皇后到下一行,並且放置途中需要判斷是否與之前放置的有衝突,直到8個皇后放置完畢,這就是一種解法,然後回溯,回到第8行繼續遍歷看是否有其它解法,如果沒有就繼續回溯到第七行遍歷,有的話就用遞迴找到下一行皇后放置的...
遞迴回溯解決8皇后問題
今天學習了經典的8皇后問題,強化了對遞迴呼叫的理解,之前自己寫遞迴老是把出口條件理解錯,導致邏輯錯誤,時常拋棧溢位的錯誤.其實簡單來說遞迴呼叫,在呼叫之前,一定要想明白,遞迴出口在哪裡,在呼叫遞迴的時候,怎麼能讓遞迴的程式碼不斷向出口方向靠近,最終能找到遞迴的出口.這個問題想明白了,遞迴呼叫也就成功...