資料結構 hash表 聰明的打

2021-06-28 13:26:10 字數 4003 閱讀 9015

【資料結構•hash表】聰明的打字員(noi2001)

time limit:100000ms  memory limit:655360k

total submit:34 accepted:16

description

聰明的打字員(clever)

阿蘭是某機密部門的打字員,她現在接到乙個任務:需要在一天之內輸入幾百個長度固定為6的密碼。當然,她希望輸入的過程中敲擊鍵盤的總次數越少越好。

不幸的是,出於保密的需要,該部門用於輸入密碼的鍵盤是特殊設計的,鍵盤上沒有數字鍵,而只有以下六個鍵:swap0, swap1, up, down, left, right,為了說明這6個鍵的作用,我們先定義錄入區的6個位置的編號,從左至右依次為1,2,3,4,5,6。下面列出每個鍵的作用:

swap0:按swap0,游標位置不變,將游標所在位置的數字與錄入區的1號位置的數字(左起第乙個數字)交換。如果游標已經處在錄入區的1號位置,則按swap0鍵之後,錄入區的數字不變;

swap1:按swap1,游標位置不變,將游標所在位置的數字與錄入區的6號位置的數字(左起第六個數字)交換。如果游標已經處在錄入區的6號位置,則按swap1鍵之後,錄入區的數字不變;

up:按up,游標位置不變,將游標所在位置的數字加1(除非該數字是9)。例如,如果游標所在位置的數字為2,按up之後,該處的數字變為3;如果該處數字為9,則按up之後,數字不變,游標位置也不變;

down:按down,游標位置不變,將游標所在位置的數字減1(除非該數字是0),如果該處數字為0,則按down之後,數字不變,游標位置也不變;

left:按left,游標左移乙個位置,如果游標已經在錄入區的1號位置(左起第乙個位置)上,則游標不動;

right:按right,游標右移乙個位置,如果游標已經在錄入區的6號位置(左起第六個位置)上,則游標不動。

當然,為了使這樣的鍵盤發揮作用,每次錄入密碼之前,錄入區總會隨機出現乙個長度為6的初始密碼,而且游標固定出現在1號位置上。當巧妙地使用上述六個特殊鍵之後,可以得到目標密碼,這時游標允許停在任何乙個位置。

現在,阿蘭需要你的幫助,編寫乙個程式,求出錄入乙個密碼需要的最少的擊鍵次數。

input

輸入檔案(clever.in)

檔案僅一行,含有兩個長度為6的數,前者為初始密碼,後者為目標密碼,兩個密碼之間用乙個空格隔開。

output

輸出檔案(clever.out)

檔案僅一行,含有乙個正整數,為最少需要的擊鍵次數。

sample input

123456 654321

sample output

11

hint樣例說明:

初始密碼是123456,游標停在數字1上。對應上述最少擊鍵次數的擊鍵序列為:

最少的擊鍵次數為11。

這題坑死我了。廣搜+hash。

自己測試時無論如何都會超時,交上評測系統竟然過了。

網上有很多優化剪枝方法,我只是剔除了「向左找這個步驟」。

在進行加減和換位變化時,我先把數字轉化為字串,開始沒有考慮數字最前面為0的情況,wa了。

varm,a,head,tail,s:longint;

f:array[0..1000000+1,0..2]of longint;

h:array[0..999999+1]of boolean;

procedure hash;

begin

if not h[a] then

begin

h[a]:=true;

tail:=(tail+1)mod 1000000;

f[tail,1]:=a;

f[tail,0]:=f[head,0]+1;

f[tail,2]:=f[head,2];

if a=s then begin write(f[tail,0]); halt; end;

end;

end;

procedure swap0;

varc:char;

s:string;

i:longint;

begin

a:=f[head,1];

m:=f[head,2];

if m=1 then exit;

str(a,s);

if length(s)<6 then

for i:=1 to 6-length(s) do

s:='0'+s;

c:=s[1];

s[1]:=s[m];

s[m]:=c;

val(s,a);

hash;

end;

procedure swap1;

varc:char;

s:string;

i:longint;

begin

a:=f[head,1];

m:=f[head,2];

if m=6 then exit;

str(a,s);

if length(s)<6 then

for i:=1 to 6-length(s) do

s:='0'+s;

c:=s[6];

s[6]:=s[m];

s[m]:=c;

val(s,a);

hash;

end;

procedure up;

vari:longint;

s:string;

begin

a:=f[head,1];

m:=f[head,2];

str(a,s);

if length(s)<6 then

for i:=1 to 6-length(s) do

s:='0'+s;

if s[m]='9' then exit;

s[m]:=chr(ord(s[m])+1);

val(s,a);

hash;

end;

procedure down;

vars:string;

i:longint;

begin

a:=f[head,1];

m:=f[head,2];

str(a,s);

if length(s)<6 then

for i:=1 to 6-length(s) do

s:='0'+s;

if s[m]='0' then exit;

s[m]:=chr(ord(s[m])-1);

val(s,a);

hash;

end;

procedure right;

begin

a:=f[head,1];

m:=f[head,2];

if m=6 then exit;

inc(m);

begin

tail:=(tail+1)mod 1000000;

f[tail,1]:=a;

f[tail,0]:=f[head,0]+1;

f[tail,2]:=m;

end;

end;

procedure bfs;

begin

head:=1;

tail:=1;

while true do

begin

swap0;

swap1;

up;down;

right;

f[head]:=f[0];

head:=(head+1)mod 1000000;

end;

end;

begin

f[0,0]:=0;

f[0,1]:=0;

f[0,2]:=0;

f[1,2]:=1;

read(f[1,1],s);

h[f[1,1]]:=true;

if f[1,1]=s then begin write(0); halt; end;

bfs;

end.

資料結構hash表

看乙個實際需求,google公司的乙個上機題 有乙個公司 當有新的員工來報道時 要求將該員工的資訊加入 id,性別,年齡,住址.當輸入該員工的id時 要求查詢到該員工的 所有資訊.要求 不使用資料庫 盡量節省記憶體 速度越快越好 雜湊表 雜湊 雜湊表 hash table 也叫雜湊表 是根據關鍵碼值...

Hash表的資料結構

hashmap與hashset的結構是差不多的,以陣列作為桶,每個桶中裝的是鍊錶,當鍊表的元素超過8個時桶中的元素自動轉為紅黑樹儲存。hashmap與hashset的預設負載因子為0.75,當hash表中的元素超過陣列長度乘以負載因子的積時會擴容,通過呼叫resize 實現,一般是擴容一倍。使用乙個...

資料結構之hash表

1.查詢的資料是表式結構,可以想象成是資料庫裡的表 2.查詢的目的是找出表中關鍵字與給定關鍵字相等的資料行 3.雜湊表就是定義了每乙個資料行的行號 4.雜湊演算法就是 行號 f 關鍵字 所以在雜湊表裡查詢資料時,不需要把給定關鍵字與每一行的關鍵字比較是否相等來找到行號,而是直接由給定的關鍵字計算出行...