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
// 题目意思是 输入n,m 要你查找m在n*n中的位置 #include<iostream> using namespace std; int a[32769]; int main() { int t,n,m,i=0,j=0,k,x,y; while(cin>>t) { while(t--) { cin>>n>>m; // n*n的矩阵,m是查找数 a[0]=1; k=0; // k为第几层 for(i=1;i<n;i++) a[i]=8*i-2+a[i-1]; // 左上对角线的值 while(a[k]<m) k++; // 查找是在那一层 i=j=n/2+1-k; // i、j都是对角线上a[k]的位置 x=a[k]-m; // 距离 if(x<=k*4) // (k*4)表示第k层第一个数与最后一个数左下部分的个数 { if(x<=k*2) // (k*2)表示有多少列 i=i+x; else { i=i+k*2; j=j+x-k*2; } } else { y=x-k*4; if(y<=k*2-1) { i=i+k*2-y; j=j+k*2; } else // 当在n的矩阵中,要查找的数大于n*n最外层对角线上的数时 { y=y-(k*2-1); i=i+1; j=j+k*2-y; } } printf("%d %d\n",i,j); } } return 0; }