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
/*题目数值大,要推理出来,找下标规律 先把对角线一半的数值推出来,并保存 再确定在哪一层之后,算出距离, */ #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; }