map做法 問題 D 寬搜入門 魔板

2021-10-05 18:39:30 字數 3055 閱讀 5921

#include

#include

#include

#include

using

namespace std;

struct node startnode, node;

map<

int,

bool

> intmapbool;

int targetmatrix[2]

[4], tempmatrix[2]

[4];

//把matrix2對應的值賦值給matrix1

void

fillmatrix

(int matrix1[

4],int matrix2[

4])}

}//轉換為int數值通過魔板

inttointbymatrxi

(int matrix[

4])}

return result;

}bool

isequal

(int matrix[

4])}

}return

true;}

void

bfs(

)printf

("\n");

return;}

q.pop();

for(

int i =

0; i <

3; i++

)for

(int j =

0; j <

4; j++

) top.steps.

push_back

('a');

break

;case1:

//操作b:將最右邊的一列插入最左邊;

tempnode.matrix[0]

[0]= top.matrix[0]

[3];

tempnode.matrix[1]

[0]= top.matrix[1]

[3];

for(

int j =

0; j <

2; j++)}

top.steps.

push_back

('b');

break

;case2:

//操作c:魔板**四格作順時針旋轉。

tempnode.matrix[0]

[1]= top.matrix[1]

[1];

tempnode.matrix[0]

[2]= top.matrix[0]

[1];

tempnode.matrix[1]

[1]= top.matrix[1]

[2];

tempnode.matrix[1]

[2]= top.matrix[0]

[2];

tempnode.matrix[0]

[0]= top.matrix[0]

[0];

tempnode.matrix[1]

[0]= top.matrix[1]

[0];

tempnode.matrix[0]

[3]= top.matrix[0]

[3];

tempnode.matrix[1]

[3]= top.matrix[1]

[3];

top.steps.

push_back

('c');

break;}

//滿足條件,入隊

int value =

tointbymatrxi

(tempnode.matrix);if

(intmapbool[value]

==false

)//移除最後乙個操作

top.steps.

pop_back()

;}}}

intmain()

;//初始化startnode.matrix

for(

int i =

0; i <

2; i++)}

while(~

scanf

("%d"

,&targetmatrix[0]

[0])

)for

(int i =

3; i >=

0; i--

)bfs()

;}return0;

}

在成功地發明了魔方之後,魯比克先生發明了它的二維版本,稱作魔板。這是一張有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

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

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

【輸入格式】

輸入有多組測試資料

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

【輸出格式】

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

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

sample input

2 6 8 4 5 7 3 1

sample output

bcabccb

八皇后問題(遞迴做法和回溯做法)

八皇后問題回溯做法要比遞迴做法簡單一些,但這個問題能很好地訓練我們的遞迴演算法。下面把兩種方法的 列出來。遞迴做法 include using namespace std int cnt 0 總共多少種情況 intnotdanger int r,int c,int chess 8 穿進去需要判斷點的...

電話聊天狂人 25分 map做法,雜湊不會

給定大量手機使用者聯絡歷史,找出其中通話次數最多的聊天狂人。輸入格式 輸入首先給出正整數n 10 5 為聯絡歷史條數。隨後n行,每行給出一條聯絡歷史。簡單起見,這裡只列出撥出方和接收方的11位數字構成的手機號碼,其中以空格分隔。輸出格式 在一行中給出聊天狂人的手機號碼及其通話次數,其間以空格分隔。如...

大數相加問題c 做法

大數相加問題c 做法 描述對您來說,我有乙個非常簡單的問題。給定兩個整數a和b,計算a b的總和。輸入由兩個正整數a和b組成。請注意,這些整數非常大,這意味著您不應使用32位整數對其進行處理。您可以假設每個整數的長度不超過1000。輸出輸出sum,sum表示a b的結果。輸入樣例 1 1 21122...