层数从0开始数,每层的最后一个数分别是1,9,25,,,,可以发现是1,3,5,,的平方,如果层数为t,则每层的最后一个数即为 n = (2t-1)^2。

如何求层数t?  t = max(|x|,|y|)

增长方向:数字的增长方向一共有上下左右四个方向,需要先算出坐标轴上的数,再通过加减纵坐标或横坐标来计算相应的数

1. t == x 增长方向向下,即为纵轴的正向方向,val = n + t + y; //n+t为横轴正半轴上的数

2. t == y 增长方向向左,即为横轴的负向方向,val = n + 3t - x; //n+3t为纵轴正半轴上的数

3. t == -x 增长方向向上,即为纵轴的负向方向,val = n + 5t -y; // n+5t为横轴负半轴上的数

4. t == -y 增长方向向右,即为横轴正向方向,val = n + 7t  + x;//n+7t为纵轴负半轴上的数

需要注意的是:第1种情况中,如果输入的坐标正好是层上的最后一个数,按照第1种情况的计算方法,则得不到正确的数,比如n+t == 2,y == -1,则得到的结果是1而不是9. 所以可以把输入的横纵坐标相等的情况归为第4中情况,即层上的最后一个数按照向右增长的数列处理。

代码如下:

#include<iostream>
#include<cstdlib>
#define pow(x) ((x)*(x))
using namespace std;

int fun(int x, int y){
    int t = abs(x)>abs(y)?abs(x):abs(y);//层数
    int n = pow(2*t-1);//t层上的最后一个数
    int val;
    if(t == y)
        val = n + 3*t - x;
    else if(t == -x)
        val = n + 5*t - y;
    else if(t == -y)
        val = n + 7*t + x;
    else
        val = n + t + y;
    return val;
}

int main(){
    int x, y;
    cin>>x>>y;
    cout<<fun(x,y)<<endl;
    return 0;
}

 

posted on 2019-03-12 16:04  小小糖果tt  阅读(203)  评论(0)    收藏  举报