BFS 雜湊 Magic Squares 魔板

2021-08-13 03:51:32 字數 1568 閱讀 6368

題目描述

在成功地發明了魔方之後,拉比克先生發明了它的二維版本,稱作魔板。這是一張有8個大小相同的格仔的魔板:

1 2 3 4

8 7 6 5

我們知道魔板的每乙個方格都有一種顏色。這8種顏色用前8個正整數來表示。可以用顏色的序列來表示一種魔板狀態,規定從魔板的左上角開始,沿順時針方向依次取出整數,構成乙個顏色序列。對於上圖的魔板狀態,我們用序列(1,2,3,4,5,6,7,8)來表示。這是基本狀態。

這裡提供三種基本操作,分別用大寫字母「a」,「b」,「c」來表示(可以通過這些操作改變魔板的狀態):

「a」:交換上下兩行;

「b」:將最右邊的一列插入最左邊;

「c」:魔板**四格作順時針旋轉。

下面是對基本狀態進行操作的示範:

a: 8 7 6 5

1 2 3 4

b: 4 1 2 3

5 8 7 6

c: 1 7 2 4

8 6 3 5

對於每種可能的狀態,這三種基本操作都可以使用。

你要程式設計計算用最少的基本操作完成基本狀態到目標狀態的轉換,輸出基本操作序列。

input

只有一行,包括8個整數,用空格分開(這些整數在範圍 1——8 之間),表示目標狀態。

output

line 1: 包括乙個整數,表示最短操作序列的長度。

line 2: 在字典序中最早出現的操作序列,用字串表示,除最後一行外,每行輸出60個字元。

分析

此題是乙個非常好的bfs用雜湊優化減時間的典範。。

因為所有組合為8!所以可以計算出陣列至少需要40320.

然後雜湊表按照慣例開大點節省時間(五六萬的素數就行了)

接著bfs,當判斷有無出現時,雜湊判斷即可

其實這題我是有自己的想法的。。

但是頻繁的錯誤讓我以為是我程式的錯。。看了看標程,即使是功能沒有區別的我也換了,還是錯。。

結果最後發現是題目沒有寫到當無法達成的時候要輸出no。。。

然後tle。雜湊表要開大,這是血的教訓。。

#include 

#include

#include

#include

using

namespace

std;

int tail,head,r[3][8],i,p=53713,len,f[40320];

string state[40321],h[53713],s;

char c[40320],q;

void pre()

int locate(string x)

bool hash(string x)

void print(int x)

void bfs()}}

while (head<=tail);

}int main()

bfs();

if (head==tail) cout

<<"no"

cout

<}

八數碼 bfs,雜湊

很經典的搜尋,bfs部分沒什麼好講的,不是很難,值得注意的是如何判定走的路徑是否重複,本題採用的是雜湊來判重 include include includetypedef int state 9 const int maxn 1000003 int head maxn next maxn head陣...

夜空繁星(BFS,雜湊)

0 leq 星群數量 leq 500 0 leq 不相似星群數量 leq 26 1 leq 星群中星星的數量 leq 160 這個的關鍵主要是找到判定兩個星群相似的方法。下面有乙個定理 若乙個星群中所有點兩兩距離的和,與另乙個星群相等,那麼這兩個星群相似。這裡給出乙個直觀的證明 將星群視為乙個多邊形...

codevs1225 八數碼難題 bfs 雜湊

題目描述 description yours和zero在研究a 啟發式演算法.拿到一道經典的a 問題,但是他們不會做,請你幫他們.問題描述 在3 3的棋盤上,擺有八個棋子,每個棋子上標有1至8的某一數字。棋盤中留有乙個空格,空格用0來表示。空格周圍的棋子可以移到空格中。要求解的問題是 給出一種初始布...