螺旋方阵

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.

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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值