回溯思想 迷宮問題(2)

2021-10-04 12:23:09 字數 1762 閱讀 4263

題目如下:

做題歷程:

看到題目時,第乙個想法就是回溯,雖然出發點是對的,但是幹了幾個小時依然卡在了乙個地方,就是標記的迷宮點是時刻變化的,當你這條路線走完後又要回到之前的點時,你標記的點又要從走過變為沒有走過,回溯實際上就是引數傳遞再返回,而因為對回溯的不熟悉,不知道如何使標記變數在引數返回時跟著同步變化(真的想了好久啊),在最後實在想不出時看了資料,最後卡住的這點終於得到解決。

解題思路:

當確定s座標後,從s座標開始上下左右走,需要判斷走的這點是否符合要求,如果符合要求,繼續往下走,直到到達t點為止,記為一次走法,引數返回,從另乙個分支開始走,若能到達t點,走法加1,引數再返回…

其中回溯有個特點是我之前不了解的,例如

void

mylist

(int p)

}

當符合條件時,mylist() 會一直進行下去,但當條件不符合for()迴圈,結束時便會返回到前乙個for()迴圈中,這樣,就會執行mylist()下面的語句,這也是同步迷宮座標標記和引數返回的關鍵點。

個人對回溯特點的理解即是:

只要符合條件就繼續呼叫原來函式執行,當條件都不符合不能繼續呼叫原函式時,返回到上一級往下執行語句。

就像乙個小泥鰍,只要有洞就會往裡面鑽,鑽到底後發現沒洞了,就會往上爬在四周繼續尋找洞口。(接受反駁和建議)

解題**:

#include

#include

using

namespace std;

struct walk

s;//記錄點的座標

int t[4]

[2]=

,,,}

;//上下左右四個方向,4行2列,0列代表x,1列代表y

int n,m;

// 輸入的n行m列,設定在外面方便呼叫,下面同理

char s[

100]

[100];

//用來記錄迷宮各點

int sum=0;

//用來統計走法

bool flag[

100]

[100];

//用來標記該點走沒走過

void

areval

(walk p)

for(

int i=

0;i<

4;i++

)//上左下右四個點

}int

main()

}}fill

(&flag[0]

[0],

&flag[n-1]

[m-1]+

1,true);

//先初始化,使該迷宮點都沒走過

flag[s.x]

[s.y]

=false

;//標記初點,使其走過

areval

(s);

//呼叫函式

if(sum==

0) cout<<

"impossible"

;else cout<

sum=0;

cout<

}return0;

}

感想:

幾個小時只做了一題,在高中這個樣子作業是寫不完的,哈哈哈,不過收穫確實也挺多的,之前做n皇后問題以為對回溯掌握了,但是其實只掌握了思路,但一些細節卻沒研究透徹,這題能完善我的理論,挺好。

迷宮回溯問題

概念介紹 請看圖,上圖為乙個迷宮,1為阻擋區間,也就是說不能走。0為可踏足地帶,我們的目標是從a點出發,走到b點,則任務完成!為了方便大家理解,我們只在 3,1 以及 3,2 這兩個位置設定阻擋位。實現 先明確實現思路 假設我們在a 1,1 位置,我們能做的操作是嘗試向下 向右 向上或者向左走一步。...

回溯法 迷宮問題

1.首先我們需要自定義乙個迷宮 左上角為入口,右下角為出口,0為路,1為牆 用二維陣列儲存 2.我們在走迷宮之前,首先要確立乙個走的順序,即貪心準則,我們首先試探的方向應該是下,然後是右,上,左 為了確保每乙個格仔都有上下左右,我們需要給我們的迷宮加上一圈牆8 8,變成10 10 3.當我們在乙個格...

迷宮問題 回溯法

描述 給乙個20 20的迷宮 起點座標和終點座標,問從起點是否能到達終點。輸入 多個測例。輸入的第一行是乙個整數n,表示測例的個數。接下來是n個測例,每個測例佔21行,第一行四個整數x1,y1,x2,y2是起止點的位置 座標從零開始 x1,y1 是起點,x2,y2 是終點。下面20行每行20個字元,...