演算法實驗三 分支限界法 六數碼問題

2021-09-08 13:50:33 字數 1874 閱讀 3463

時限:1000ms 記憶體限制:10000k  總時限:3000ms

描述現有一兩行三列的**如下:

a b c

d e f

把1、2、3、4、5、6六個數字分別填入a、b、c、d、e、f格仔中,每個格仔乙個數字且各不相同。每種不同的填法稱為一種布局。如下:

1 3 5

2 4 6

布局12 5 6

4 3 1

布局2定義α變換如下:把a格中的數字放入b格,把b格中的數字放入e格,把e格中的數字放入d格,把d格中的數字放入a格。

定義β變換如下:把b格中的數字放入c格,把c格中的數字放入f格,把f格中的數字放入e格,把e格中的數字放入b格。

問:對於給定的布局,可否通過有限次的α變換和β變換變成下面的目標布局:

1 2 3

4 5 6

目標布局

輸入本題有多個測例,每行乙個,以eof為輸入結束標誌。每個測例的輸入是1到6這六個數字的乙個排列,空格隔開,表示初始布局abcdef格中依次填入的數字。

輸出每個輸出佔一行。可以轉換的,列印yes;不可以轉換的,列印no。

輸入樣例

1 3 5 2 4 6

2 5 6 4 3 1

輸出樣例

noyes

提示第二個示例即布局2的一種轉換方法:αααβαα

題解:這個題也是一道很簡單的利用廣搜和佇列解決的問題。對於輸入的序列,可以用一維或者二維陣列存下來,這裡我用一維存,然後進入bfs後,每次取出隊首的序列,進行兩個不同的變換,即α和β變換,這裡的變換可在外邊寫函式實現,裡邊只在for迴圈裡讓兩者都變換就行,然後將變換得到的狀態入佇列,並且步數加一。當然入佇列之前還要檢查這步是否早已被到達了,如果它已經被到達了肯定就不用 變換了,肯定有比他搶先到達並且步數更少的,那麼它沒有必要入佇列,不然就不會滿足廣搜最優的性質了。

然後重點來了,那麼我們怎麼檢查當然的狀態是否已經用過了呢?佇列裡的每一步的狀態是邊用邊離開的,以前的狀態都沒有儲存下來,所以我們沒辦法遍歷佇列進行比較看是否它用過了。那麼這裡我們有兩種解決辦法,第一種是利用c++自帶的map函式,可以自帶查重的功能,這個大家可以自行查詢。第二種是自己的土方法,就是從佇列剛開始工作時,就把每一步的狀態都存到乙個二維陣列裡,以後的新狀態都遍歷這個二維陣列進行查重。這兩種方法都是行得通的。

這裡大家可能發現廣搜的不同的題目的解決方法。像本題,八數碼之類的查重,每步是否走過比較的不僅僅是乙個位置,而是整個狀態圖上的所有元素的集合,每個狀態圖就是乙個狀態,這決定著我們不能只是設定乙個used陣列就行,而必須用map函式或者我們的土方法。第二種題目就是像跳馬,加一乘二平方,電子老鼠闖迷宮那樣,每個位置就代表乙個狀態,加一乘二平方每乙個數,一維的used陣列,跳馬和電子老鼠裡的每乙個位置,二維的used陣列,就不用map函式了。

**如下:

#include#include#includeusing namespace std;

int m[10];

queueq;

int num=0;

mapused;

void init()

void readdata()

int move(int cur,int state)

int a,b,c,d,e,f;

if(state==0)

else

for(int i=0;i<6;i++)

res=res*10+m[i];

return res;

}int bfs()}}

return 0;

}int main()

{ readdata();

init();

if(bfs()==1)

cout<<"yes"

演算法實驗三 分支限界法 獨輪車

時限 1000ms 記憶體限制 10000k 總時限 3000ms 描述獨輪車的輪子上有紅 黃 藍 白 綠 依順時針序 5種顏色,在乙個如下圖所示的20 20的迷宮內每走乙個格仔,輪子上的顏色變化一次。獨輪車只能向前推或在原地轉向。每走一格或原地轉向90度均消耗乙個單位時間。現給定乙個起點 s 和乙...

演算法入門7 分支限界法

中已經提到過,回溯法的思想是深度優先搜尋加剪枝,與之相對,分支限界法的思想是廣度優先搜尋加剪枝。1.分支限界法 廣度優先搜素 1.簡單概述 分支限界法思路的簡單描述是 把問題的解空間轉化成了圖或者樹的結構表示,然後使用廣度優先搜尋策略進行遍歷,遍歷的過程中記錄和尋找所有可行解或者最優解。基本思想類同...

演算法入門(5) 分支限界法

一 基本描述 類似於回溯法,也是一種在問題的解空間樹t上搜尋問題解的演算法。但在一般情況下,分支限界法與回溯法的求解目標不同。回溯法的求解目標是找出t中滿足約束條件的所有解,而分支限界法的求解目標則是找出滿足約束條件的乙個解,或是在滿足約束條件的解中找出使某一目標函式值達到極大或極小的解,即在某種意...