Problem Description
Given an odd number n, we can arrange integers from 1 to n*n in the shape of a spiral. The figure below illustrates the spiral made by integers from 1 to 25.
1 2 3 4 5
------------------------
1 | 21 22 23 24 25
2 | 20 7 8 9 10
3 | 19 6 1 2 11
4 | 18 5 4 3 12
5 | 17 16 15 14 13
As we see above, each position in the spiral corresponds to a unique integer. For example, the number in row 1, column 1 is 21, and integer 16 is in row 5, column 2.
Now, given the odd number n (1<=n<=32768), and an integer m (1<=m<=n*n), you should write a program to find out the position of m.
1 2 3 4 5
------------------------
1 | 21 22 23 24 25
2 | 20 7 8 9 10
3 | 19 6 1 2 11
4 | 18 5 4 3 12
5 | 17 16 15 14 13
As we see above, each position in the spiral corresponds to a unique integer. For example, the number in row 1, column 1 is 21, and integer 16 is in row 5, column 2.
Now, given the odd number n (1<=n<=32768), and an integer m (1<=m<=n*n), you should write a program to find out the position of m.
Input
The first line of the input is a positive integer T(T<=20). T is the number of the test cases followed. Each case consists of two integer n and m as described above.
Output
For each case, output the row number and column number that the given integer is in, separated by a single whitespace. Please note that the row and column number are both starting from 1.
Sample Input
3
3 9
5 21
5 16
Sample Output
1 3
1 1
5 2
Author
代码:
/*题目数值大,要推理出来,找下标规律
先把对角线一半的数值推出来,并保存
再确定在哪一层之后,算出距离,
*/
#include<cstdio>
#include<iostream>
using namespace std;
int a[32769];
int main()
{
int i, j, t, m, n;
int count = 0, x, y;
while(scanf("%d", &t) != EOF)
{
while(t--)
{
scanf("%d%d", &n, &m);
count = 0;
for(i = 0; i < n; i++) //得出对角线的数值
if(i == 0) a[i] = 1;
else a[i] = 8 * i - 2 + a[i - 1];
while(a[count] < m) count++; //确定在哪一层
i = j = n / 2 + 1 - count; //确定行列坐标的大概位置
x = a[count] - m; //距离 左下半部分(竖行) 的距离(从行列到具体数值的距离)
if(x <= count * 4)
{
if(x <= count * 2) //列
i = i + x;
else//行
{
i = i + count * 2;
j = j + x - count * 2;
}
}
else
{
y = x - count * 4; //距离 右上半部分(竖行) 的距离(从行列到具体数值的距离)
if(y <= count * 2 - 1) //列
{
i = i + count * 2 - y;
j = j + count * 2;
}
else//行(比本行的对角数还要大)
{
y = y - (count * 2 - 1);
i = i + 1;
j = j + count * 2 - y;
}
}
printf("%d %d\n", i, j);
}
}
return 0;
}