poj 2046 bfs 構造局面的hash值

2021-10-04 17:37:40 字數 2081 閱讀 2679

對於乙個長度為15陣列,每個元素1<=ai

<=15.問你這個陣列的hash值。

如果對ai沒有其他限制,那麼這個陣列的hash值應該這樣計算

ll hash =0;

for(

int i =

0;i<

15;i++

) hash+

=a[i]

,hash*=15

;

如果ai兩兩之間不相等,也就是1到15都出現且只出現一次,那麼這個陣列的hash值應該這樣計算

ll hash =0;

for(

int i =

0;i<

15;i++

) hash+

=a[i]

,hash*=2

;

為什麼是乘2不是乘15呢,仔細想想就明白了;

題意:給你乙個4*8的棋盤,每個格仔可能是空格,也可能有乙個值ai,j,ai,j = i * 4 + j,(1<=i<=4,1<=j<=7,且任意兩個格仔的值互不相等,每個可能的值都出現一次。),你可以把某個數字移動到某個空格,空格是任意的,但這個數字要等於要移動的空格左邊的數字的值加1,給你初始局面,你可以先把第一列填好(先把11,21,31,41這四個數跟到第一列對應位置的數互換,這個操作不計算入步數),然後問你最少多少步可以到這個局面。

12 13 14 15 16 17 21

22 23 24 25 26 27 31

32 33 34 35 36 37 41

42 43 44 45 46 47 11

26 31 13 44 21 24 42

17 45 23 25 41 36 11

46 34 14 12 37 32 47

16 43 27 35 22 33 15

17 12 16 13 15 14 11

27 22 26 23 25 24 21

37 32 36 33 35 34 31

47 42 46 43 45 44 41

27 14 22 35 32 46 33

13 17 36 24 44 21 15

43 16 45 47 23 11 26

25 37 41 34 42 12 31輸出0

3360

-1思路:

暴力bfs,然後記錄走過的局

面的hash值,求hash值的方法前面已經寫過了(poj不能用unordered_map,用map也能ac)

**

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

//#include

//#include

#define inf 0x3f3f3f3f

#define linf 0x3f3f3f3f3f3f3f3f

#define ll long long

#define ull unsigned long long

#define uint unsigned int

using

namespace std;

struct board

bool

is_right()

bool

board_move

(int x,

int y)

}demo;

ll get_hash

(board x)

intbfs()

}}}return-1

;}intmain()

printf

("%d\n"

,bfs()

);}return0;

}

poj 2046 迴圈子串問題

題目 poj 2046 這個題目有個結論 若s存在迴圈子串,當且僅當,len可以被len prefix len 1 整除。連線次數為len len prefix len 1 充分性我不會證明,我就證明下必要性吧。不放假設s pattern n len strlen s 顯然prefix len 1 ...

poj3984(BFS)迷宮路徑

迷宮問題 time limit 1000ms memory limit 65536k total submissions 6112 accepted 3539 description 定義乙個二維陣列 int maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,...

poj3984 迷宮問題 BFS

迷宮問題 time limit 1000ms memory limit 65536k total submissions 7902 accepted 4649 description 定義乙個二維陣列 int maze 5 5 它表示乙個迷宮,其中的1表示牆壁,0表示可以走的路,只能橫著走或豎著走,...