問題描述:
使用者從螢幕輸入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的二維陣列,表示乙個迷宮。資料保證有唯一最短路徑。左上角到右下角的最短路徑,格式如樣例...
分支限界法求解迷宮問題
分支限界法類似與回溯法,也是一種在問題的解空間樹上搜尋問題的解法。但後者的目標是找到滿足約束條件的所有解,而前者要求找到某種意義下的最優解 極大值 極小值 分支限界法採用廣度優先的策略,依次搜尋活結點的所有分支,也就是所有相鄰結點。設計合適的限界函式,排除該活結點不可能產生最優解的孩子結點,來提高搜...