重排九宮(廣度優先演算法)

2021-09-03 07:11:41 字數 940 閱讀 1062

採用了廣度優先演算法(部分改進),在加入子節點的時候將其按照代價函式從小到大排序,在檢測之前是否出現時使用了雜湊表,將九個數連起來的數作為該狀態在雜湊表中的位置,如果出現過設為1

1.主要流程

void

solution

(node start, node target)if(

iftarget

(open[k]

, target)

)//是否是目標結點

q = i;

cout <<

"step 0"

<< endl;

start.

show()

;for

(i = q -

1;i >=

0;i--

)//cout << "solve!" << endl;

break;}

j =getzerolocation

(open[k]);

//0的位置

changeopen

(open[k]

, j)

; k++

; c++;}

}

2.代價函式

void node::

seteva()

3.節點類

//節點類

class

node

;

這個使用了廣度優先演算法,在加子節點的時候使用了區域性優先演算法,但還是效率有點低,在排序的時候自己比較了各種情況,也有點複雜,可以用優先佇列來實現,更加簡潔,a*演算法也由此容易實現。還有輸出結果的時候邏輯有點亂,但是輸出成功了就沒再管。?

藍橋杯 歷屆試題 九宮重排(廣度優先搜尋bfs)

問題描述 如下面第乙個圖的九宮格中,放著 1 8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。我們把第乙個圖的局面記為 12345678.把第二個圖的局面記為 123.46758 顯然是按從上到下,從左到右的順序記錄數字,空格...

歷屆試題 九宮重排

問題描述 如下面第乙個圖的九宮格中,放著 1 8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。我們把第乙個圖的局面記為 12345678.把第二個圖的局面記為 123.46758 顯然是按從上到下,從左到右的順序記錄數字,空格...

藍橋杯 九宮重排

九宮重排 如下面第乙個圖的九宮格中,放著 1 8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。我們把第乙個圖的局面記為 12345678.把第二個圖的局面記為 123.46758 顯然是按從上到下,從左到右的順序記錄數字,空格...