C 藍橋杯 九宮重排

2021-10-23 04:24:46 字數 1405 閱讀 5200

題目:如下面第乙個圖的九宮格中,放著 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 顯然是按從上到下,從左到右的順序記錄數字,空格...