zoukankan      html  css  js  c++  java
  • [Hnoi2006]马步距离

    1285: [Hnoi2006]马步距离

    Time Limit: 1 Sec  Memory Limit: 128 MB
    Submit: 36  Solved: 16
    [Submit][Status][Web Board]

    Description

    在国际象棋和中国象棋中,马的移动规则相同,都是走“日”字,我们将这种移动方式称为马步移动。如右图所示,从标号为0的点出发,可以经过一步马步移动达到标号为1的点,经过两步马步移动达到标号为2的点。
    任给平面上的两点p和s,它们的坐标分别为(xp,yp)和(xs,ys),其中,xp,yp,xs,ys均为整数。从(xp,yp)出发经过一步马步移动 可以达到(xp+1,yp+2)、(xp+2,yp+1)、(xp+1,yp-2)、(xp+2,yp-1)、(xp-1,yp+2)、(xp- 2,yp+1)、(xp-1,yp-2)、(xp-2,yp-1)。假设棋盘充分大,并且坐标可以为负数。现在请你求出从点p到点s 至少需要经过多少次马步移动?

    Input

    只包含4个整数,它们彼此用空格隔开,分别为xp,yp,xs,ys。并且它们的都小于10000000。

    Output

    含一个整数,表示从点p到点s至少需要经过的马步移动次数。

    Sample Input

    1 2 7 9

    Sample Output

    5

    HINT

     

    Source

     1 #include <bits/stdc++.h>
     2 using namespace std; 
     3 int dx[8]={1,1,-1,-1,2,2,-2,-2};
     4 int dy[8]={2,-2,2,-2,1,-1,1,-1};
     5 int a,b,c,d,x,y,ans;
     6 int px[100000];
     7 int py[100000];
     8 int h[30][30];
     9 bool v[30][30];
    10 
    11 void bfs()
    12 {
    13     int head,tail,xx,yy,x,y,i;
    14     head=0;
    15     tail=1;
    16     px[1]=0;
    17     py[1]=0;
    18     memset(h,127,sizeof(h));
    19     h[0][0]=0;
    20     while (head!=tail)
    21     {
    22         head++;
    23         x=px[head];
    24         y=py[head];
    25         v[x][y]=false;
    26         for (i=0;i<8;i++)
    27         {
    28             xx=x+dx[i];
    29             yy=y+dy[i];
    30             if (xx>-10 && xx<20 && yy>-10 && yy<20)
    31             if (h[xx][yy]>h[x][y]+1)
    32             {
    33                 h[xx][yy]=h[x][y]+1;
    34                 if (!v[xx][yy])
    35                 {
    36                     tail++;
    37                     px[tail]=xx;
    38                     py[tail]=yy; 
    39                     v[x][y]=true; 
    40                 }
    41             }
    42         }
    43     }
    44 }
    45 
    46 int main()
    47 {
    48     cin>>a>>b>>c>>d;
    49     x=abs(a-c);
    50     y=abs(b-d);
    51     bfs();
    52     while (x>=10 || y>=10)
    53     {
    54         if (x>y)
    55         {
    56             x=x-2;
    57             y=y-1;
    58         }
    59         else
    60         {
    61             x=x-1;
    62             y=y-2;
    63         }
    64         ans++;
    65         x=abs(x);
    66         y=abs(y);
    67     }
    68     ans=ans+h[x][y];
    69     cout<<ans<<endl;
    70     return 0;
    71 }
    马步距离
  • 相关阅读:
    shell 命名管道,进程间通信
    bash shell:重定向标准错误输出
    paramiko socket.error: Int or String expected
    django csrf_token生成
    shell基础知识
    复制vi全部内容到windows ctrl+shift+c
    linux配置bridge (不同网段)
    sdk shell下脚本.soc
    X86服务器BMC基板管理控制器介绍
    linux 开启vnc
  • 原文地址:https://www.cnblogs.com/LHR-HY/p/6879026.html
Copyright © 2011-2022 走看看