分支限界法 最少步數走出迷宮

2021-07-30 21:36:07 字數 1303 閱讀 2243

問題描述:

使用者從螢幕輸入m,n表示乙個m*n的迷宮,0表示空地,1表示牆,給定起點的行,列;給定終點的行,列;輸出最少到達目標的步數;

示例輸入:

4 4

0 0 1 0

0 1 0 0

0 0 0 1

0 0 0 0

0 0

2 2

樣例輸出:

5問題分析:

1.根據分支限界法基本思想(詳見上篇分支限界部落格)

(1)分支:當前位置每次有四種可能的走法上下左右,可分四個子狀態;

(2)限界:若為牆,則不能走;若走過,則不能走;

2.確定輸入輸出:

迷宮的行列m,n;

迷宮的初始狀態;

起點的座標;

終點的座標;

輸出乙個最小步數;

3.確定所需資料結構:

二維陣列表示迷宮;

佇列存放路徑;

4.確定狀態值:

迷宮中-2牆(為了計算與表示方便,將牆1置為-2,若為正常的額1表示,則需要多餘的資料結構來記錄某點是否走過),-1表示未走過,其餘數字值表示從起點至當前位置所需步數;

方向:0-up, 1-down, 2-left, 3-right;

**展示:

#include 

#include

using

namespace

std;

queue

q1;

int room[20][20];

int start, aim;

int m, n;

void readdata()

}cin >> r >> c;

start = r * n + c;

cin >> r >> c;

aim = r * n + c;

}bool canmove(int u, int a)

if (row >= 0 && row < n && col >= 0 && col < n)

if (room[row][col] != -2)

return

true;

return

false;

}int moveto(int u, int a)

return u;

}int run()}}

}return0;}

int main()

分支限界演算法 步數最少問題

資料結構 設queue 佇列,儲存從 1,1 可達的點 queue k 1 2 以及到達該點所需要的最少步數 queue k 3 0 k 192 1 佇列的首指標為head,尾指標為tail。初始時,queue中只有乙個元素為 1,1 最少步數為0。s 記錄 1,1 到每點所需要的最少步數。顯然,問...

迷宮問題 分支限界法

分支限界法求解迷宮問題 定義乙個二維陣列,例如 int maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,不能斜著走,要求程式設計序找出從左上角到右下角的最短路線。乙個5 5的二維陣列,表示乙個迷宮。資料保證有唯一最短路徑。左上角到右下角的最短路徑,格式如樣例...

分支限界法求解迷宮問題

分支限界法類似與回溯法,也是一種在問題的解空間樹上搜尋問題的解法。但後者的目標是找到滿足約束條件的所有解,而前者要求找到某種意義下的最優解 極大值 極小值 分支限界法採用廣度優先的策略,依次搜尋活結點的所有分支,也就是所有相鄰結點。設計合適的限界函式,排除該活結點不可能產生最優解的孩子結點,來提高搜...