给定一个数字,输出其坐标,坐标从下往上从左往右递增...方法就如矩阵里面的。
对于一个数字,如果是完全平方数就直接特判输出,非完全平方数的话可以判断出在第几层(半包围结构).
第n层的元素有2n-1个。判断完层数可以得知起点终点的方式就知道如何输出。
然后如果大于层数元素的一半,那么方式再次变化...
其实方式就是层数到底是x坐标还是y坐标...
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define mod 1000007
#define inf 0x3f3f3f3f
#define N 100100
using namespace std;
int main()
{
int t;
scanf("%d",&t);
for(int cas=1; cas<=t; cas++)
{
ll n;
scanf("%lld",&n);
ll h=sqrt(1.0*n);
printf("Case %d: ",cas);
if(h*h==n)
{
if(h%2==0)
printf("%d 1\n",h);
else
printf("1 %d\n",h);
}
else
{
ll tmp=n-h*h;
ll sum=h*2+1;
int f=h%2;
h++;
if(tmp>sum/2)
{
f=f^1;
tmp-=sum/2;
tmp=h-tmp+1;
}
if(!f)
printf("%lld %lld\n",h,tmp);
else
printf("%lld %lld\n",tmp,h);
}
}
return 0;
}