歷屆試題 九宮重排
時間限制: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 顯然是按從上到下,從左到右的順序記錄數字,空格...