题目描述
将从0开始的自然数按照以下的规则放置在一个无限大的网格上:
0 放置在坐标为 (0, 0) 的格子上
1 放置在 0 右侧的格子 (1, 0) 上
后续的数字围绕已经放置的数字逆时针循环
如图所示(只展示了部分数字)
输入坐标x,y(-10000 < x,y < 10000),输出对应坐标格子的数值
输入描述:
每组测试数据有多行输入,请处理到文件结束。
每行两个整数 x, y
输出描述:
对于每行输入 x, y,输出一行数字,输出对应坐标格子的数值
示例1
输入
-2 -2
0 0
输出
16
0
/*
求解思路:
step 1: 以坐标 (0,0) 为中心将所有数值分层,第 0 层只有 0 这一个数值,第 1 层的数值为 1 ~ 8,第 2 层的数值为 9 ~ 24,
step 2: 对于输入的坐标 (x,y),可以判断这个坐标在第几层。且层数等于 x 与 y 的绝对值中最大的那一个,即层数 layer = max(abs(x),abs(y));
step 3: 然后根据层数求出这一层的起始数字: startNum = (2*layer-1)*(2*layer-1);
step 4: 再根据具体的坐标点和 startNum 计算与此坐标对的应格子里的数值。
*/
#include <iostream>
#include<algorithm>
using namespace std;
int getNumber(int x, int y){
int layer = max(abs(x),abs(y)); //根据坐标计算对应格子所在层数
int startNum = (2*layer-1)*(2*layer-1); //计算这一层的起始数值
int number;
//根据具体的坐标点和 startNum 计算与此坐标对的应格子里的数值
if(x==layer && y!=-layer){
number = startNum+(y+layer-1);
}else if(y==layer){
number = startNum+(2*layer-1)+(layer-x);
}else if(x==-layer){
number = startNum+(4*layer-1)+(layer-y);
}else if(y==-layer){
number = startNum+(6*layer-1)+(x+layer);
}
return number;
}
int main( )
{
int x, y, i=0, numbers[100000];
while (cin>>x>>y){
numbers[i++] = getNumber(x, y);
}
for(int j=0; j<i; j++){
cout << numbers[j] << endl;
}
return 0;
}