
层数从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; }
浙公网安备 33010602011771号