老曹騎士 (standard io)
time limits: 1000 ms memory limits: 65536 kb detailed limits
description
我們的主角——老曹隕落於西洋棋棋盤,成為了一位老曹騎士,於是,他開始走「日」字型路線。
在一張n*n的棋盤上,有k只**的河蟹,騎士曹現在要消滅這些河蟹。
要求曹從任意乙隻河蟹出發,通過他「日」字型的跳躍,到達這k個點至少一次,並最終回到起點。
現在已知棋盤的大小n,和這k只河蟹的位置(棋盤的左上角座標記為(1,1),右下角座標記為(n,n)。
詢問:曹最少要跳多少步。
input
第一行:兩個整數,n,k(4<=n<=20,1<=k<=10)
接下來k行:每行兩個整數x,y,表示河蟹所在位置。
output
乙個整數,表示曹所需要條的最少步數。
sample input
8 32 3
4 56 7
sample output
正解bfs求出每兩個河蟹之間的距離,用dfs求最小值。
我的方法:用深搜(記憶化搜尋)求出每兩個河蟹之間的距離,用全排列求出每種情況下的值,輸出最小值即可。
(謝絕co標)code:
uses
math;
var i,j,n,k,l,s,ans:longint;
hx:array[1..10,1..2]of longint;//河蟹位置
map,a:array[0..21,0..21]of longint;//棋盤和記憶化陣列
f:array[1..10,1..10]of longint;//記錄每兩個河蟹之間的距離
b:array[1..10]of boolean;//全排列標記
sx:array[0..10]of longint;//跳順序列舉(全排列)
fx:array[1..8,1..2]of longint=((1,2),(2,1),(2,-1),(1,-2),(-1,-2),(-2,-1),(-2,1),(-1,2));//老曹可以跳的八個方向
procedure
get(x,y:longint);
//求每兩個河蟹之間的距離
var t1,t2,j:longint;
begin
if i<>map[x,y] then
begin
if map[x,y]>=1
then
begin
if f[i,map[x,y]]>a[x,y]then
begin
f[i,map[x,y]]:=a[x,y];
f[map[x,y],i]:=a[x,y];
exit;
end;
end;
end;
for j:=1to8
dobegin
t1:=x+fx[j,1];
t2:=y+fx[j,2];
if (t1>=1)and(t1<=n)and(t2>=1)and(t2<=n)then
if a[t1,t2]>a[x,y]+1
then
begin
a[t1,t2]:=a[x,y]+1;
get(t1,t2);
end;
end;
end;
procedure
dg(x:longint);
//全排列
var i:longint;
begin
if x-1=k then
begin
s:=0;
for i:=1
to k-1
dobegin
s:=s+f[sx[i],sx[i+1]];
end;
s:=s+f[sx[i+1],sx[1]];
ans:=min(ans,s);
end;
for i:=1
to k do
begin
if b[i]=false
then
begin
inc(sx[0]);
sx[sx[0]]:=i;
b[i]:=true;
dg(x+1);
dec(sx[0]);
b[i]:=false;
end;
end;
end;
begin
readln(n,k);
if k=1
then
begin
writeln(0);
exit;
end;
for i:=1
to k do
begin
readln(l,s);
hx[i,1]:=l;
hx[i,2]:=s;
map[l,s]:=i;
end;
fillchar(f,sizeof(f),100);
for i:=1
to k do
begin
fillchar(a,sizeof(a),102);
a[hx[i,1],hx[i,2]]:=0;
get(hx[i,1],hx[i,2]);
end;
ans:=maxlongint;
dg(1);
writeln(ans);
end.
老曹的憂鬱
description 我們的主角 老曹,現在十分憂鬱。原因是他在玩乙個困難的遊戲。遊戲規則如下 有 n 1 n 2個圓盤,在平面上擺成了乙個變長為n個圓盤的等邊三角形。每個圓盤上標有乙個小寫字母 a z 如下圖所示。對於每個字母,當我們可以由標為這個字母的圓盤為頂點,構成等邊三角形時,我們稱這個字...
老曹的憂鬱
題目描述 我們的主角 老曹,現在十分憂鬱。原因是他在玩乙個困難的遊戲。遊戲規則如下 有 n 1 n 2個圓盤,在平面上擺成了乙個變長為n個圓盤的等邊三角形。每個圓盤上標有乙個小寫字母 a z 如下圖所示。對於每個字母,當我們可以由標為這個字母的圓盤為頂點,構成等邊三角形時,我們稱這個字母為不和諧的。...