洛谷 P1747 好奇怪的游戏
题目
题目背景
《爱与愁的故事第三弹·shopping》娱乐章。
调调口味来道水题。
题目描述
爱与愁大神坐在公交车上无聊,于是玩起了手机。一款奇怪的游戏进入了爱与愁大神的眼帘:*(游戏名被打上了马赛克)。这个游戏类似象棋,但是只有黑白马各一匹,在点x1,y1和x2,y2上。它们得从点x1,y1和x2,y2走到1,1。这个游戏与普通象棋不同的地方是:马可以走“日”,也可以像象走“田”。现在爱与愁大神想知道两匹马到1,1的最少步数,你能帮他解决这个问题么?
输入输出格式
输入格式:
第1行:两个整数x1,y1
第2行:两个整数x2,y2
输出格式:
第1行:黑马到1,1的距离
第2行:白马到1,1的距离
输入输出样例
输入样例#1:
12 16
18 10
输出样例#1:
8
9
说明
100%数据:x1,y1,x2,y2<=20
题解
BFS
代码(Pascal)
const flag:array[1..12,0..1]of longint=((1,2),(1,-2),(-1,2),(-1,-2),(2,1),(2,-1),(-2,1),(-2,-1),(2,2),(-2,2),(2,-2),(-2,-2));
var n,m,tail,head,f,x,y:longint;
map:array[0..45,0..45]of longint;
vis:array[0..45,0..45]of boolean;
q:array[0..1605]of record
x,y,z:longint;
end;
function check(x,y:longint):boolean;
begin
if (x<1)or(y<1)or(x>40)or(y>40)or(vis[x,y]=true) then exit(false);
exit(true);
end;
procedure find(x,y:longint);
begin
inc(tail);vis[x,y]:=true;
q[tail].x:=x;q[tail].y:=y;
q[tail].z:=q[head].z+1;
if (x=1)and(y=1) then begin
writeln(q[tail].z);
f:=1;
end;
end;
procedure bfs(x,y:longint);
var i:longint;
begin
if (x=1)and(y=1) then writeln('0')
else
begin
fillchar(vis,sizeof(vis),0);
head:=0;tail:=1;f:=0;
q[1].x:=x;q[1].y:=y;q[1].z:=0;
vis[x,y]:=true;
while head<tail do
begin
inc(head);
x:=q[head].x;y:=q[head].y;
for i:=1 to 12 do
if f=1 then continue
else if check(x+flag[i,0],y+flag[i,1]) then find(x+flag[i,0],y+flag[i,1]);
if f=1 then head:=tail;
end;
end;
end;
procedure main;
begin
readln(x,y);
bfs(x,y);
readln(x,y);
bfs(x,y);
end;
begin
main;
end.