八數碼問題 九宮格重排 利用康托展開 判重

2021-08-22 17:52:47 字數 1161 閱讀 3801

問題 e: [藍橋杯][歷屆試題]九宮重排

時間限制: 1sec 記憶體限制: 128mb 提交: 69 解決: 17

題目描述

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

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

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

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

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

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

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

樣例輸入

12345678. 

123.46758

樣例輸出

3
#includeusing namespace std;

string s,d;

bool vis[400000];

int fac[11];

void init()

int cantor(string a, int n)

x += fac[n - i - 1] * smaller; // 康托展開累加

}return x+1;  // 康托展開值

}int ans=-1;

void bfs()

;    int dy[4]=;

queueq;

string t=s;

q.push(t);

q.push("");

vis[cantor(t,9)]=1;

int depth=0;int x,y;int x2,y2;int newpos;

while(!q.empty())

if(t==d)

else

swap(t[pos-1],t[newpos-1]);}}

}}int main()

九宮格問題

include include stl 雙端佇列容器 include include pos.h using namespace std ofstream fout sudoku.txt deque d int lay deque d int checkout pos p,int n int sud...

2016 11 25 九宮格問題

題目大意 數獨規則點這裡 注意可以有格仔是空的。空的格仔用 表示。方法一.位運算 知道了這個之後,就很好辦啦。因為數字只有九個,而且不允許重複出現。直接想到位運算!表示當前數字,只需要把1向右移動當前數字位。然後設定乙個狀態變數,儲存當前有多少數字出現過。把他們相與,如果為0說明此數字還沒出現過,就...

九宮格為問題

在 射鵰英雄傳 中黃蓉曾破解九宮格,口訣 戴九履一,左三右七,二四有肩,八六為足,五居 有口訣的!一居上行正 依次斜填莫相忘,上出框時向下放,右出框時向左放,排重編在下格放,右上排重乙個樣。重排九宮 有兩種玩法 第一種是在在3 3方格盤上,是把1至8八個小木塊隨意擺放,每一空格其周圍的數字可移至空格...