洛谷 P1747 好奇怪的游戏

10 篇文章 0 订阅

洛谷 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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值