問題描述
如下面第乙個圖的九宮格中,放著 1~8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。
我們把第乙個圖的局面記為:12345678.
把第二個圖的局面記為:123.46758
顯然是按從上到下,從左到右的順序記錄數字,空格記為句點。
本題目的任務是已知九宮的初態和終態,求最少經過多少步的移動可以到達。如果無論多少步都無法到達,則輸出-1。
輸入格式
輸入第一行包含九宮的初態,第二行包含九宮的終態。
輸出格式
輸出最少的步數,如果不存在方案,則輸出-1。
樣例輸入
12345678.
123.46758
樣例輸出
3樣例輸入
13524678.
46758123.
樣例輸出
22思路:學習大佬部落格passerbyorz
法一:雙向bfs+map去重 100 用時 78ms 藍橋杯
#include
#include
#include
#include
#include
using
namespace std;
const
int d[
2]=,
,,};
//上右下左
string origin;
//初始狀態
string dest ;
//最終狀態
mapint> vis;
mapint> step;
void
bfs(
) queue q1;
queue q2;
q1.push
(origin)
; vis[origin]=1
; step[origin]=0
; q2.
push
(dest)
; vis[dest]=2
; step[dest]=0
;while
(!q1.
empty()
||!q2.
empty()
)else
int pos;
for(
int i =
0; i
length()
; i++)if
(head[i]
=='.'
)int x = pos /3;
int y = pos %3;
for(
int i =
0; i<
4; i++
)else
if(vis[s]
+ vis[head]==3
)}}}
}int
main()
法二:雙向bfs+字典樹 100 用時31ms 藍橋杯
這我是真的酸,人家學了資料結構活學活用真的強,我嗚嗚嗚啥也不會!
#include
#include
#include
#include
#include
using
namespace std;
const
int d[
2]=,
,,};
//上右下左
string origin;
//初始狀態
string dest;
//最終狀態
typedef
struct node
}node;
class
trie
;trie::
trie()
int trie::
insert
(string s,
int flag,
int step)if(
!flag)
u = v;
} u-
>flag = flag;
u->step = step;
return success;
}node* trie::
find
(string s)if(
!flag)
return
null
; u = v;
}return u;
}trie trie;
void
bfs(
) queue q1;
queue q2;
q1.push
(origin)
; trie.
insert
(origin,1,
0); q2.
push
(dest)
; trie.
insert
(dest,2,
0);while
(!q1.
empty()
||!q2.
empty()
)else
int pos;
for(
int i =
0; i
length()
; i++)if
(head[i]
=='.'
)int x = pos /3;
int y = pos %3;
for(
int i =
0; i<
4; i++
)else
if(t-
>flag + h-
>flag ==3)
}}}}
intmain()
歡迎批評指正! 藍橋杯 歷屆試題 九宮重排
問題描述 如下面第乙個圖的九宮格中,放著 1 8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。我們把第乙個圖的局面記為 12345678.把第二個圖的局面記為 123.46758 顯然是按從上到下,從左到右的順序記錄數字,空格...
藍橋杯 歷屆試題 九宮重排
問題描述 如下面第乙個圖的九宮格中,放著 1 8 的數字卡片,還有乙個格仔空著。與空格子相鄰的格仔中的卡片可以移動到空格中。經過若干次移動,可以形成第二個圖所示的局面。我們把第乙個圖的局面記為 12345678.把第二個圖的局面記為 123.46758 顯然是按從上到下,從左到右的順序記錄數字,空格...
藍橋杯 歷屆試題 九宮重排
bfs 查重 因為通過不同的路徑到達同乙個點會產生不同的串,不具有唯一性,所以查重不再是查詢乙個點到沒到過,而是找乙個中間串出沒出現過,set一下就行了 include include include include include include include include include i...