UVA 1030 Delta-wave

在这里插入图片描述
两格子之间的距离
http://acm.hdu.edu.cn/showproblem.php?pid=1030

走一步判断一下 下一步走哪里
是走下面呢(前提要能走)
还是走左边
还是走右边

设定一个格子,代表当前走到的地方
如果能直接向下走,就向下走
不能的话:
如果终点在当前格子的哪一边(只看左右方向,不看上下),就走哪一边

#include<iostream>
#include<cmath>
using namespace std;

// 同一行 相邻的能通过
// 上下行  上行的第奇数个能和下行中第偶数个过

//1 3 5 7
//1 2*1-1 2*n-1
//(1+ 2*n-1)*n/2 = int(a)

//第 sqrt(a) +1 行
//第 a - sqrt(a)^2 个


// 向左走,向右走?

int which(int a){
    int n = sqrt(a-1);
    int ge = a-n*n;
    n ++;
    return n;
}
int getmid(int a){
    int n = which(a);
    return pow(n-1,2) + n;
}
int main(){
    int a,b;
    while(cin>>a>>b){
        if(a>b)
            a^=b^=a^=b;

        int go = a;
        int b_n = which(b);// 行
        int b_mid = getmid(b);
        int go_mid;
        int go_n;
        int sum = 0;
        while(go != b){
            go_n = which(go);
            if(go_n == b_n){
                sum += abs(go - b);
                break;
            }
            else if((go_n+go) % 2 == 0){
                // 直接下去
                go = go + go_n*2;
                sum++;
                continue;
            }

            go_mid = getmid(go);
            int go_distance = go - go_mid; //go距离行中线的距离
            int b_distance = b - b_mid;    // b 距离中线的距离
            int hang_distance = go_distance - b_distance;  // go 到 b的距离

            if(hang_distance<0){  // b 在 go 的右边
                // right
                go ++;
            }else // b 在 go 右边 或 b和go在同一列
                go--;
            }
//            else{
                if(b - b_mid < 0)
//                    go--;
                else
                    go++;
//            }
            sum++;
        }
        cout<<sum<<endl;
    }
    return 0;
}

// AC at 2019/3/9 23:09

我只能想到这个笨办法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值