搜尋 HOJ 1868 八數碼

2021-06-20 09:28:19 字數 1771 閱讀 1596

my tags

(edit)

source: hcpc 2005 spring

time limit: 2 sec

memory limit: 32 m

submitted: 1434,accepted: 399

在 3*3 的棋盤上有 8 個將牌,每乙個將牌都刻有 1-8 數碼中的某乙個數碼。棋盤中留有乙個空格,允許其周圍的某乙個將牌向空格移動,這樣通過移動將牌就可以不斷改變將牌的布局。

給定一種初始時的將牌布局或結構(稱作初始狀態)和乙個目標的布局(稱作目標狀態),問如何移動將牌,實現從初始狀態到目標狀態的改變,給出合法步驟中最小的移動步數。如下圖所示

輸出格式:給出可以使初始狀態轉換到目標狀態的最小移動次數,如果轉化不到列印出-1。

輸入樣例:

2

2 8 3

1 6 4

7 0 5

2 3 0

1 8 4

7 6 5

2 8 3

1 6 4

7 0 5

2 8 3

1 4 6

7 0 5

輸出樣例:

3

-1

題意:給出乙個八數碼的初始狀態,給出結束狀態,問從初始狀態到結束狀態最少需要移動多少步,如果不可達,輸出-1

思路:雙廣搜尋。。。。判斷不可達的話可以用逆序數,如果兩個狀態同為奇排列或者偶排列,那麼可達,否則不可達。然後hash用的是康托展開。。。。

**:

#include #include #include #include #include #include #include#include#include #include #include using namespace std;

#define eps 1e-8

#define ll long long

const int maxn =370000;

int factorial[10];

int move[2][4] = , };

int d[2][maxn];

int hash(char state[3][3])

return ret;

}struct node

now ,init , dest;

void input()

} for (int i = 0 ; i < 3 ; ++i)

scanf(" %c %c %c%*c",&dest.state[i][0],&dest.state[i][1],&dest.state[i][2]);

for (int i = 0 ; i < 3 ; ++i) }

}bool solvable()

p = &dest.state[0][0];

int cnt2 = 0;

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

if ( (cnt1%2) == (cnt2%2) ) return true;

return false;

}int dbfs() }}

int main()

printf("%d\n",dbfs());

}}

搜尋 八數碼問題

搜尋 高階列舉 有順序有策略地列舉狀態空間中的節點,尋找問題 的解 狀態空間 由所有狀態構成的狀態樹 經典八數碼問題 有乙個3 3的棋盤,其中有0 8共9個數字,0表示空 格,其他的數字可以和0交換位置。求由初始狀態 到達目標狀態的步數最少的解?8 2 3 1 4 6 5 7 0 1 2 3 4 5...

A 搜尋 八數碼問題

八數碼問題,簡單地來描述是這樣的 在乙個九宮格內,填有1 2 3 4 5 6 7 8,八個阿拉伯數字,有乙個格仔為空白。就下面這樣,這是乙個沒有歸位的九宮格。12 3784 65 未歸位的九宮格 對於上面這個九宮格,我們要通過移動數字來使之歸位,每次移動都只能是與空白格相鄰的數字移到空白格裡面。最終...

八數碼全域性擇優搜尋

step 1 初始化初始節點資訊和目的節點資訊 void chushihua node s,node g step 2 計算初始節點與目標節點的逆序數,判斷初始節點與目的節點是否可達,若不可達,則輸出 無解 若可達,則轉至step 3 void nixushu node s,node g step ...