1313 老曹騎士 TJ

2021-07-14 11:31:02 字數 2735 閱讀 4921

老曹騎士 (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 如下圖所示。對於每個字母,當我們可以由標為這個字母的圓盤為頂點,構成等邊三角形時,我們稱這個字母為不和諧的。...