採用了廣度優先演算法(部分改進),在加入子節點的時候將其按照代價函式從小到大排序,在檢測之前是否出現時使用了雜湊表,將九個數連起來的數作為該狀態在雜湊表中的位置,如果出現過設為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 顯然是按從上到下,從左到右的順序記錄數字,空格...