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 31 15 2
# include<cstdio>
# include<iostream>
using namespace std;
int main()
{
//freopen("a.txt","r",stdin);
int t;
cin>>t;
while(t--)
{
int i,n,m,flag=1,x,r,c,cnt,mul=0,y=1,z=0;
__int64 sum;
cin>>n>>m;
for(i=1;i<=n;i+=2)
{
sum=i*i;
if(sum==m)
{
cout<<1+(n-i)/2<<' '<<n-(n-i)/2<<endl;
y=0;
break;
}
if(sum>m)
{
x=i;
break;
}
}
r=1+(n-i)/2,c=n-(n-i)/2;
sum-=m;
x-=1;
for(i=1;i<=sum;i++)
{
cnt=i-mul;
if(flag==1)
{
c=c-1;
if(cnt==x)
{
flag=flag+1;
mul+=x;
}
continue;
}
if(flag==2)
{
r=r+1;
if(cnt==x)
{
flag=flag+1;
mul+=x;
if(!z) z=1;
else x-=1;
}
continue;
}
if(flag==3)
{
c=c+1;
if(cnt==x)
{
flag=flag+1;
mul+=x;
x-=1;
}
continue;
}
if(flag==4)
{
r=r-1;
if(cnt==x)
{
flag=1;
mul+=x;
}
continue;
}
}
if(y)
cout<<r<<' '<<c<<endl;
}
return 0;
}
参考 C