网易2019年春招笔试:输出对应格子的数值

题目描述

将从0开始的自然数按照以下的规则放置在一个无限大的网格上:

0 放置在坐标为 (0, 0) 的格子上
1 放置在 0 右侧的格子 (1, 0) 上
后续的数字围绕已经放置的数字逆时针循环

如图所示(只展示了部分数字)
网易2019年春招笔试:输出对应格子的数值_第1张图片
输入坐标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  
#include
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;
}

你可能感兴趣的:(算法收集)