• 1193: [HNOI2006]马步距离


    1193: [HNOI2006]马步距离

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 2027  Solved: 915
    [Submit][Status][Discuss]

    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
    /*
        大范围贪心,小范围搜索
    */
    #include <bits/stdc++.h>
    
    #define MAXN 205
    
    using namespace std;
    
    
    struct Node{
        int x,y;
        Node(){}
        Node(int _x,int _y){
            x=_x;
            y=_y;
        }
    };
    int xp,yp,xs,ys;
    int res;
    int dir[8][2]={1,2,-1,2,1,-2,-1,-2,2,1,-2,1,2,-1,-2,-1};
    int vis[MAXN][MAXN];
    
    int bfs(int x,int y){    
        Node start=Node(x,y);
        Node ne;
        queue<Node>q;
        q.push(start);
        int s=0;
        while(!q.empty()){
            ne=q.front();
            q.pop();
            for(int i=0;i<8;i++){
                int fx=ne.x+dir[i][0];
                int fy=ne.y+dir[i][1];
                if(fx<0||fx>100||fy<0||fy>100||vis[fx][fy]!=0){
                    continue;
                }
                vis[fx][fy]=vis[ne.x][ne.y]+1;
                q.push(Node(fx,fy));
            }    
        }        
    }
    
    inline void init(){
        res=0;
        memset(vis,0,sizeof vis);
    }
    
    int main(){
    //    freopen("in.txt","r",stdin);
        init();
        scanf("%d%d%d%d",&xp,&yp,&xs,&ys);
        int x=abs(xs-xp);
        int y=abs(ys-yp);
        while(x+y>50){
            if(x<y)
                swap(x,y);
            if(x-4>=y*2)
                x-=4;
            else
                x-=4,y-=2;
            res+=2;
        }
        bfs(x+50,y+50);
        res+=vis[50][50];
        printf("%d
    ",res);    
        return 0;
    }
  • 相关阅读:
    Oracle学习 第29天 存储过程生成报表
    Oracle学习 第28天 存储过程输出结果集
    Python学习 第9天 连接FTP和数据库
    Bat脚本学习-6:Oracle自动备份还原脚本
    Bat脚本学习-5:Oracle自动备份还原脚本
    Bat脚本学习-4:Oracle自动备份还原脚本
    Vue学习 第2天 又看了个教程,加深理解
    Vue学习 第1天 初始Vue及MVVM
    下半年加油,好久没上来冒个泡了
    Python学习 第8天 打包exe
  • 原文地址:https://www.cnblogs.com/wuwangchuxin0924/p/7851018.html
Copyright © 2020-2023  润新知