【資料結構•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 654321sample output
11hint樣例說明:
初始密碼是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 關鍵字 所以在雜湊表裡查詢資料時,不需要把給定關鍵字與每一行的關鍵字比較是否相等來找到行號,而是直接由給定的關鍵字計算出行...