迷宮問題讓你深度理解遞迴 回溯)

2021-10-19 17:58:51 字數 1643 閱讀 6821

當你看到遞迴時,如果腦子裡想著迴圈,一層層向下呼叫,一層層回溯,總想著計算機的每一步是怎麼做的,這樣就會陷入學習遞迴的思維誤區;

正確的做法是什麼呢?(遮蔽遞迴細節)

假設a問題,可以細分為bcd這三個小問題,那麼我們就應該考慮bcd這三者怎麼解決,然後能解決之後再考慮bcd和a的關係;

例:如果要解決我坐在電影院第幾排,那麼就可以分成規模更小的問題,然後問題就成為了很多個前一排在哪一排的問題;求解自己在哪一排的思路和前面一排的人求解的思路一樣

1.寫出遞推公式(找到如何將大問題分解為小問題的規律,基於此寫出遞推公式)

2.找到終止條件

(注:如果沒有終止條件,遞迴就成為了死龜了?)

思路:1.使用乙個二維陣列代表迷宮,數字1代表牆,2**通路,3代表死路 ,0代表還未走過

2.走的策略:下-右-上-左

3.如果走到某個點不通,就將該點標記為3;然後返回false,棧頂就會彈出乙個方法,所以會回退到上一步

**

package com.company;

/** * @author:抱著魚睡覺的喵喵

* @date:2021/2/21

* @description:

*/public

class

maze

for(

int j =

0; j <

9; j++

) maze[2]

[2]=

1;//額外為迷宮加入兩個牆作為障礙

maze[2]

[1]=

1;for(

int i =

0; i <

9; i++

) system.out.

println()

;}getpath

(maze,1,

1); system.out.

println

("路徑如下:");

for(

int i =

0; i <

9; i++

) system.out.

println()

;}}/**

* 迷宮的行走策略:下-右-上-左

* @param map

* @param x

* @param y

* @return

*/public

static

boolean

getpath

(int

map,

int x,

int y)

else

elseif(

getpath

(map, x, y+1)

)elseif(

getpath

(map, x-

1, y)

)elseif(

getpath

(map, x, y-1)

)else

}else}}

}

願你孤獨的努力都有回報,願你前行的路上有人陪伴~

一起加油哈?

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

目的 從左上角走到右下角。地圖用陣列表示,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...

遞迴 回溯 裝載問題

之前討論了最優裝載問題的貪心演算法,這裡討論最優裝載問題的乙個變形。1 問題描述 有一批共n個貨櫃要裝上兩艘載重量分別為c1和c2的輪船,其中貨櫃為wi,且 要求確是否有乙個合理的裝載方案可將這n個貨櫃裝上這2艘輪船?如果有,找出一種裝載方案。例如,當n 3,c1 c2 50,且w 10,40,40...

有趣的迷宮問題(遊戲) 遞迴回溯演算法詳解

3 迷宮解決 4 迷宮遊戲 完整 傳送門 全國大學生計算機技能應用 2020年 c 科目決賽程式設計題解 迷宮問題簡介 現有乙個n n的方格迷宮圖,相當於二維陣列,初始化中值為2表示 牆壁 值為0表示可走空地。現在給定入口位置 starti,startj 出口位置 endi,endj 設計一種演算法...