對於乙個長度為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表示可以走的路,只能橫著走或豎著走,...