其实我想说,ZOJ的2月竞赛真TM容易啊。
另外在凌晨4点做已经结束的竞赛题,也真TM蛋疼。
#include <stdio.h>
#include <math.h>
int sq(int x)
{
return(x*x);
}
void find(int n, int* c, int* mm)
{
int m = sqrt(n-1)/2;
*mm=m;
if(n == sq(2*m)+1)
*c=0;
else if (n>=sq(2*m)+2 && n<= sq(2*m)+2*m)
*c=1;
else if (n==sq(2*m)+2*m+1)
*c=2;
else if (n>=sq(2*m)+2*m+2 && n<=sq(2*m+1))
*c=3;
else if (n==sq(2*m+1)+1)
*c=4;
else if (n>=sq(2*m+1)+2 && n<=sq(2*m+1)+1+2*m)
*c=5;
else if (n==sq(2*m+1)+2+2*m)
*c=6;
else
*c=7;
return;
}
void showans(int a,int b,int c,int d)
{
int e[4];
e[0]=a;
e[1]=b;
e[2]=c;
e[3]=d;
int i,f;
do
{
f=0;
for(i=0;i<3;i++)
{
if(e[i]>e[i+1])
{
f=e[i];
e[i]=e[i+1];
e[i+1]=f;
f=1;
}
}
}
while(f==1);
printf("%d %d %d %d\n",e[0],e[1],e[2],e[3]);
}
main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
if(n==1)
{
printf("2 4 6 8\n");
continue;
}
/*
.gggggf
.x....e
.a....e
.a.o..e
.a....e
.bccccd
.......
将图划分成如上样子。
x = (2m)^2+1 来找到a 图中m=2
根据 n 的相对于x和m的位置,将n的位置限定为x~7这8个可能的位置之间
case 与m的关系 左侧 右侧 上侧 下侧
0 x = (2m)^2+1 x + 8m + 5 x - 1 x + 8m + 3 x + 1
1 a = (2m)^2+2 ~ (2m)^2 + 2m a + 8m + 5 a - 8m + 3 a - 1 a + 1
2 b = (2m)^2+2m+1 b + 8m + 5 b + 1 b - 1 b + 8m +7
3 c = (2m)^2+2m+2 ~ (2m+1)^2 c - 1 c + 1 c - 8m + 1 c + 8m +7
4 d = (2m+1)^2+1 d - 1 d + 8m + 9 d + 1 d + 8m +7
5 e = (2m+1)^2+2 ~ (2m+1)^2+1+2m e - 8m - 1 e + 8m + 9 e + 1 e - 1
6 f = (2m+1)^2+2+2m f + 1 f + 8m + 9 f + 8m + 11 f - 1
7 g = (2m+1)^2+3+2m ~(2m+2)^2 g + 1 g - 1 g + 8m + 11 g - 1
*/
int c,m;
find(n,&c,&m);
int l,r,t,b;
switch(c)
{
case 0:
l=n+8*m+5;
r=n-1;
t=n+8*m+3;
b=n+1;
break;
case 1:
l=n+8*m+5;
r=n-8*m+3;
t=n-1;
b=n+1;
break;
case 2:
l=n+8*m+5;
r=n+1;
t=n-1;
b=n+8*m+7;
break;
case 3:
l=n-1;
r=n+1;
t=n-8*m+1;
b=n+8*m+7;
break;
case 4:
l=n-1;
r=n+8*m+9;
t=n+1;
b=n+8*m+7;
break;
case 5:
l=n-8*m-1;
r=n+8*m+9;
t=n+1;
b=n-1;
break;
case 6:
l=n+1;
r=n+8*m+9;
t=n+8*m+11;
b=n-1;
break;
case 7:
l=n+1;
r=n-1;
t=n+8*m+11;
b=n-8*m-3;
break;
}
showans(l,r,t,b);
}
}