• bzoj 1193 贪心+bfs


    1193: [HNOI2006]马步距离

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 2015  Solved: 914
    [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

    HINT

    //大范围贪心,小范围bfs即可,贪心时横纵距离谁大谁减2,还要横纵距离控制在不小于起点。以前做过一个大范围贪心小范围dp。
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    using namespace std;
    typedef long long ll;
    const int MAXN=100009;
    bool vis[300][300];
    int dir[8][2]={2,1,2,-1,1,2,1,-2,-2,1,-2,-1,-1,2,-1,-2};
    int dfs(int sx,int sy,int ex,int ey)
    {
        queue<int>q;
        vis[sx][sy]=1;
        q.push(sx);q.push(sy);q.push(0);
        while(!q.empty()){
            int x=q.front();q.pop();
            int y=q.front();q.pop();
            int cnt=q.front();q.pop();
            if(x==ex&&y==ey) return cnt;
            for(int i=0;i<8;i++){
                int xx=x+dir[i][0],yy=y+dir[i][1];
                if(xx<90||xx>210||yy<90||yy>210) continue;
                if(vis[xx][yy]) continue;
                vis[xx][yy]=1;
                q.push(xx);q.push(yy);q.push(cnt+1);
            }
        }
    }
    int main()
    {
        int sx,sy,ex,ey;
        memset(vis,0,sizeof(vis));
        scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
        ex-=sx;ey-=sy;
        sx=sy=100;
        if(ex<0) ex=-ex;
        if(ey<0) ey=-ey;
        ex+=100;ey+=100;
        ll ans=0;
        while(ex-sx>=100||ey-sy>=100){
            if(ex>=ey){
                ex-=2;
                if(ey>100) ey-=1;
                else ey+=1;
            }else{
                ey-=2;
                if(ex>100) ex-=1;
                else ex+=1;
            }
            ans++;
        }
        ans+=dfs(sx,sy,ex,ey);
        printf("%lld
    ",ans);
        return 0;
    }
  • 相关阅读:
    list页面-按照choice筛选丶传condition过滤筛选项丶筛选与显示同步
    组件添加模糊搜索功能
    B
    51nod 1137矩阵乘法【矩阵】
    NYOJ 2356: 哈希计划【模拟】
    【数学基础】【最小公倍数和最大公约数】
    51 nod 1012 最小公倍数LCM【数论】
    poj 1753【枚举+dfs(位向量法)】
    【算法竞赛入门经典】7.3子集生成【增量构造法】【位向量法】【二进制法】
    1057 N的阶乘 【数论】
  • 原文地址:https://www.cnblogs.com/--ZHIYUAN/p/7822960.html
Copyright © 2020-2023  润新知