蓝桥杯刷题|04普及-真题

简介: 蓝桥杯刷题|04普及-真题

[蓝桥杯 2018 省 B] 螺旋折线

题目描述

如图所示的螺旋折线经过平面上所有整点恰好一次。

对于整点 (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)

输入输出样例

输入 #1  0 1

输出 #1  3

说明/提示

对于 40%的数据,−−1000≤X,Y≤1000。

对于 70% 的数据,− ≤X,Y≤

对于 100% 的数据,− ≤X,Y≤

思路

对于这个题,我把图中所有的点都列了出来然后发现规律

(0,0)        0

对于绝对值最大是1的

(-1,0)       1

(-1,1)       2

(0,1)        3

(1,1)        4

(1,0)        5

(1,-1)       6

(0,-1)       7

(-1,-1)      8

对于绝对值最大是2的

(-2,-1)        9

(-2,0)        10

(-2,1)        11

(-2,2)        12

       

 (-1,2)        13

 (0,2)        14

 (1,2)        15

 (2,2)        16

(2,1)        17

(2,0)        18

(2,-1)        19

(2,-2)        20

(1,-2)        21

(0,-2)        22

(-1,-2)        23

(-2,-2)        24

对于绝对值最大是3的

(-3,-2)        25

(-3,-1)        26

(-3,0)        27

(-3,1)        28

(-3,2)        29

(-3,3)        30

(-3,3)        31        

(-2,3)        32

(-1,3)        33

(0,3)        34

(1,3)        35

(2,3)        36

       

(3,2)           37

(3,1)           38

(3,0)            39

(3,-1)           40

(3,-2)           41

(3,-3)          42

       

(2,-3)          43

(1,-3)          44

(0,-3)        45

(-1,-3)        46

(-2,-3)        47

(-3,-3)        48

假设最大的绝对值为n,可以发现每一种距离的范围都是 (不包括 )因此可以根据n来缩小计算的范围

代码1

#include<iostream>
#include<cmath>//包含求绝对的函数 
using namespace std;
int main()
{
  long long int x,y,num=0,a;
  cin>>x>>y;
  long long int n=(abs(x)>abs(y))?abs(x):abs(y);
  long long int X=(-1)*n,Y=(-1)*(n-1);//第一个坐标
  for(long long int i=(2*n-1)*(2*n-1)+1;i<(2*n+1)*(2*n+1);i++)
  {
    if(X == ( - 1 ) * n && Y > (-1)*n && Y < n ) Y ++;
    
    else if ( X < n && X >= ( - 1 ) * n && Y == n)X++;
    
    else if(X == n && Y <= n && Y > ( - 1 ) * n)Y--;
    
    else if(X < n && X > ( - 1 ) * n && Y == ( - 1 ) * n) X--;
    else;
    
    if(Y==y&&X==x)
    {
      num=i;
      break;
    } 
  } 
  cout<<num<<endl;
  
  
  return 0;
}

这样对于大的数字就会超时,只能得84分

后面我又根据横坐标和做坐标相同,可以将每个分为4部分,每次找到这一部分的第一个在开始遍历,就又缩小计算的范围,缩短时间。

代码2

#include<iostream>
#include<cmath>//包含求绝对的函数 
using namespace std;
int main()
{
  long long int x,y,num=0,a;
  
  cin>>x>>y;
  long long int n=(abs(x)>abs(y))?abs(x):abs(y);
  long long int X=0,Y=0;
  if(x==(-1)*n){a=0;X=(-1)*n,Y=(-1)*(n-1);}
  if(y==n){a=1;Y=n,X=(-1)*(n-1);}
  if(x==n){a=2;X=n,Y=n-1;}
  if(y==(-1)*n){a=3;X=n-1,Y=(-1)*n;}
  //a代表第几部分
  long long int b=(2*n-1)*(2*n-1)+a*2*n;
  
  for(long long int i=b;i<b+2*n;i++)
  {
    if(Y==y&&X==x)
    {
      num=i;
      break;
    }
    
    if(X == ( - 1 ) * n && Y > (-1)*n && Y < n ) Y++;
    
    else if ( X < n && X >= ( - 1 ) * n && Y == n)X++;
    
    else if(X == n && Y <= n && Y > ( - 1 ) * n)Y--;
    
    else if(X <= n && X > ( - 1 ) * n && Y == ( - 1 ) * n) X--;
    else;
    
  
  } 
  cout<<num<<endl;
  
  
  return 0;
}

最后吧这个放在一起方便观察

相关文章
|
6月前
|
存储 人工智能 算法
第十四届蓝桥杯真题解析
第十四届蓝桥杯真题解析
98 0
|
6月前
|
人工智能 算法
第十三届蓝桥杯真题解析
第十三届蓝桥杯真题解析
67 3
|
6月前
|
测试技术
蓝桥杯刷题|01普及-真题
蓝桥杯刷题|01普及-真题
|
6月前
|
测试技术
蓝桥杯真题|02普及-真题
蓝桥杯真题|02普及-真题
|
6月前
|
测试技术
蓝桥杯刷题|02入门真题
蓝桥杯刷题|02入门真题
|
6月前
|
测试技术
蓝桥杯刷题|03入门真题
蓝桥杯刷题|03入门真题
|
6月前
|
测试技术
蓝桥杯刷题|01入门真题
蓝桥杯刷题|01入门真题
|
算法 前端开发 Java
【备战十四届蓝桥杯 | 开篇】如何高效备战蓝桥杯
【备战十四届蓝桥杯 | 开篇】如何高效备战蓝桥杯
141 0
下一篇
无影云桌面