藍橋杯 九宮重排(八數碼問題)

2021-08-07 07:55:52 字數 1301 閱讀 9459

歷屆試題 九宮重排  

時間限制:1.0s   記憶體限制:256.0mb

問題描述

如下面第乙個圖的九宮格中,放著 1~8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。

我們把第乙個圖的局面記為:12345678.

把第二個圖的局面記為:123.46758

顯然是按從上到下,從左到右的順序記錄數字,空格記為句點。

本題目的任務是已知九宮的初態和終態,求最少經過多少步的移動可以到達。如果無論多少步都無法到達,則輸出-1。

輸入格式

輸入第一行包含九宮的初態,第二行包含九宮的終態。

輸出格式

輸出最少的步數,如果不存在方案,則輸出-1。

樣例輸入

12345678.

123.46758

樣例輸出 3

樣例輸入

13524678.

46758123.

樣例輸出 22

本題是a*演算法的典型例題,練習之後可以對a*演算法的原理有一定的理解。但是本文主要講解另一種方法(a*演算法抽空發布)。

明白康托展開和逆康托展開後,就可以通過bfs求最少步數了。

**:

#include using namespace std;

const int maxn=500000;//康托展開的最大數字

struct node

;int fac[11]=;//0~8的階乘

int st,goal;

bool vis[maxn];//標記康托展開的數字

int setkt(char *str)//康托展開成數字

swap(str[index],str[index-1]);//恢復

}

if(index%3<2)

swap(str[index],str[index+1]);//恢復

}if(index/3>0)

swap(str[index],str[index-3]);//恢復

}if(index/3<2)

swap(str[index],str[index+3]);//恢復 }}

return -1;

}int main()

藍橋杯 九宮重排

九宮重排 如下面第乙個圖的九宮格中,放著 1 8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。我們把第乙個圖的局面記為 12345678.把第二個圖的局面記為 123.46758 顯然是按從上到下,從左到右的順序記錄數字,空格...

C 藍橋杯 九宮重排

題目 如下面第乙個圖的九宮格中,放著 1 8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。我們把第乙個圖的局面記為 12345678.把第二個圖的局面記為 123.46758 顯然是按從上到下,從左到右的順序記錄數字,空格記為...

藍橋杯 歷屆試題 九宮重排

問題描述 如下面第乙個圖的九宮格中,放著 1 8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。我們把第乙個圖的局面記為 12345678.把第二個圖的局面記為 123.46758 顯然是按從上到下,從左到右的順序記錄數字,空格...