第九届蓝桥杯C/C++省赛B组 试题G:螺旋折线(19分)

在这里插入图片描述
如图所示的螺旋折线经过平面上所有整点恰好一次。
对于整点(X, Y),我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度。
例如dis(0, 1)=3, dis(-2, -1)=9
给出整点坐标(X, Y),你能计算出dis(X, Y)吗?

【输入格式】
X和Y

【输出格式】
输出dis(X, Y)

【样例输入】

0 1

【样例输出】

3

对于40%的数据,-1000 <= X, Y <= 1000
对于70%的数据,-100000 <= X, Y <= 100000
对于100%的数据, -1000000000 <= X, Y <= 1000000000

解题思路

这种题目给出来一定是找规律做的。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
struct point{
ll x=0;
ll y=0;    
};
  
int main()
{
    //一个周期,左,上,右,下
    //第i个周期,左,上分别移动t步,右,下分别移动t+1步 
            
    struct point p,f;
    ll step=0;
    ll t=1,flag=0;
    cin>>p.x>>p.y;
  
      while(1){
          if(f.x==p.x&&f.y==p.y) break;
          if(f.x<p.x){
          step+=t;f.x-=t;    
        }
        else{
          for(ll i=1;i<=t;i++){//左 
              f.x--;step++;
              if(f.x==p.x&&f.y==p.y){
                  flag=1;break;
              }
          }if(flag) break;
            }
         if(f.y>p.y){
         step+=t;f.y+=t;    
         }
         else{
         for(ll i=1;i<=t;i++){//上 
             f.y++;step++; 
              if(f.x==p.x&&f.y==p.y){
                  flag=1;break;
              }
         }if(flag) break;
    }    if(f.x>p.x){
        step+=t+1;f.x+=t+1;
    }
    else{
          for(ll i=1;i<=t+1;i++){//右 
              f.x++;step++;
              if(f.x==p.x&&f.y==p.y){
                  flag=1;break;
              }
          }if(flag) break;
    }
    if(f.y<p.y){
        step+=t+1;f.y-=(t+1);
    }else{
    
          for(ll i=1;i<=t+1;i++){//下 
              f.y--;step++;
              if(f.x==p.x&&f.y==p.y){
                  flag=1;break;
              }
          }if(flag) break;
    }
        t+=2;//之前写成t++,仔细观察你会发现第一个周期是1开始的,第一个周期t=1;第二个周期t=t+2; 
            //第二个周期是3开始的,第三个周期是5开始的             
      }cout<<step;                
  return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值