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 ...