題目:如下面第乙個圖的九宮格中,放著 1~8 的數字卡片,還有乙個格仔空著。
與空格子相鄰的格仔中的卡片可以移動到空格中。
經過若干次移動,可以形成第二個圖所示的局面。
我們把第乙個圖的局面記為:12345678.
把第二個圖的局面記為:123.46758
顯然是按從上到下,從左到右的順序記錄數字,空格記為句點。
本題目的任務是已知九宮的初態和終態,求最少經過多少步的移動可以到達。如果無論多少步都無法到達,則輸出-1。
思路:這是一道經典的利用bfs的題目,這類狀態變換的題,一般都是用寬搜。
此題的關鍵是如何判重,在查閱資料以後發現可以用康托展開這樣一種東西來形成對映,每乙個字元陣列都對應著唯一的康托展開。
判重的問題解決了以後就可以進行bfs了。
**
#include
#include
using namespace std;
int mul[10]
=;int flag[
400000];
//開闢輔助空間用來對映查重
struct node
;void
getmul()
}int getnum
(char *s)
//求每乙個字元陣列的康托展開
sum+=num*mul[
8-i];}
return sum;
}void
bfs()}
} int endflag=
getnum
(end)
; queue q;
q.push
(beginnode)
; flag[beginnode.flag]=1
;while
(!q.
empty()
) node linknode;
if(cur.x-
1>=0)
//如果空格能向上移動 }if
(cur.x+
1<3)
//如果空格能向下移動 }if
(cur.y-
1>=0)
//如果空格能向左移動 }if
(cur.y+
1<3)
//如果空格能向右移動 }}
printf
("-1");
}int main()
藍橋杯 九宮重排
九宮重排 如下面第乙個圖的九宮格中,放著 1 8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。我們把第乙個圖的局面記為 12345678.把第二個圖的局面記為 123.46758 顯然是按從上到下,從左到右的順序記錄數字,空格...
藍橋杯 歷屆試題 九宮重排
問題描述 如下面第乙個圖的九宮格中,放著 1 8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。我們把第乙個圖的局面記為 12345678.把第二個圖的局面記為 123.46758 顯然是按從上到下,從左到右的順序記錄數字,空格...
藍橋杯 歷屆試題 九宮重排
問題描述 如下面第乙個圖的九宮格中,放著 1 8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。我們把第乙個圖的局面記為 12345678.把第二個圖的局面記為 123.46758 顯然是按從上到下,從左到右的順序記錄數字,空格...