使用遞迴回溯解決迷宮問題

2021-10-08 12:07:38 字數 1660 閱讀 1482

/*

目的:從左上角走到右下角。

地圖用陣列表示,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皇后問題,強化了對遞迴呼叫的理解,之前自己寫遞迴老是把出口條件理解錯,導致邏輯錯誤,時常拋棧溢位的錯誤.其實簡單來說遞迴呼叫,在呼叫之前,一定要想明白,遞迴出口在哪裡,在呼叫遞迴的時候,怎麼能讓遞迴的程式碼不斷向出口方向靠近,最終能找到遞迴的出口.這個問題想明白了,遞迴呼叫也就成功...