藍橋杯 歷屆試題 九宮重排 (廣搜)

2021-07-11 07:05:13 字數 1339 閱讀 9697

歷屆試題 九宮重排  

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

問題描述

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

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

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

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

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

輸入格式

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

輸出格式

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

樣例輸入

12345678.

123.46758

樣例輸出 3

樣例輸入

13524678.

46758123.

樣例輸出 22

主要是標記剪枝,我用的set,不過聽學長說可以用康托展開,可是康托展開好難。。

寫得挺蠢的也過了,藍橋資料應該挺水的吧。。

#include #include #include #include #include #include using namespace std;

char map1[5][5], map2[5][5];

int b1x, b1y;

struct node ;

int dir[4][2] = ;

sets;

int bfs()

} tstr[k] = 0;

string str(tstr); //字元陣列轉string

s.insert(str);

q.push(now);

while(!q.empty())

}if(flag) break;

} if(i == 4) return now.step;

for(i = 0; i < 4; i++)

}string str1(tstr);

if(s.count(str1) == 1) continue;

else s.insert(str1);

q.push(next);

} }return -1;

}int main()

} getchar();

for(i = 1; i <= 3; i++)

} getchar();

cout << bfs() << endl;

return 0;

}

藍橋杯 歷屆試題 九宮重排

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

藍橋杯 歷屆試題 九宮重排

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

藍橋杯 歷屆試題 九宮重排

bfs 查重 因為通過不同的路徑到達同乙個點會產生不同的串,不具有唯一性,所以查重不再是查詢乙個點到沒到過,而是找乙個中間串出沒出現過,set一下就行了 include include include include include include include include include i...