26……
25 10 11 12 13
24 9 2 3 14
23 8 1 4 15
22 7 6 5 16
21 20 19 18 17
問題描述:
如果有這么個矩正(無限大)。起點1坐標是(0,0),2是(0,1),3是(1,1),4是(1,0),5是(-1,-1)……
現給出a點坐標(x,y) 求a點數值?
JAVA算法如下:

public static long getPointNumber(int a, int b)
{

if (a == b && a == 0)
{ //特別情況
return 1;
}
int CircleN = Math.max(Math.abs(a), Math.abs(b)); //坐標所在的是第幾圈 0、1、2、3……
long start = 4 * CircleN * (CircleN - 1) + 2; //所在圈最小的那個數字,即左上角右邊那個數字
//根據a b算出距離加到start上,即所求

if (b == CircleN && a != -CircleN)
{
return start + a + CircleN - 1;

} else if (a == CircleN)
{
return start + 3 * CircleN - b - 1;

} else if (b == -CircleN)
{
return start + 5 * CircleN - a - 1;

} else
{
return start + 7 * CircleN + b - 1;
}
}
另外附加反向問題代碼,己知一個點的數值,求出這個點的坐標:

void getNumberPoint(long number)
{
//在此不return了,打印出來吧

if (number <= 0)
{
System.out.println("Error! Can't be Negative or ZERO!");
return;

} else if (number == 1)
{
System.out.println(number + "'s position is : " + "(0,0)");
return;
}
long startCircleN = (long)Math.floor(Math.sqrt(number)); //取number平方根的整數部分
long CircleN = getRightCircleIndex(number, startCircleN); //求出number在第幾圈
long start = getStartNumber(CircleN); //所在圈最小的那個數字,即左上角右邊那個數字
long distance = number - start;
long sideLen = 2 * CircleN + 1; //一條邊上有幾個數字
String outPut = number + "'s position is : " + "(";

if (distance <= sideLen - 2)
{
outPut += (-CircleN + 1 + distance) + "," + CircleN + ")";

} else if (distance <= 2 * sideLen - 3)
{
outPut += CircleN + "," + (CircleN - (distance - (sideLen - 2))) + ")";

} else if (distance <= 3 * sideLen - 4)
{
outPut += (CircleN - (distance - (2 * sideLen - 3))) + "," + -CircleN + ")";

} else
{
outPut += -CircleN + "," + (-CircleN + (distance - (3 * sideLen - 4))) + ")";
}
System.out.println(outPut);
}


long getRightCircleIndex(long number, long N)
{

if (number >= getStartNumber(N))
{

if (number < getStartNumber(N + 1))
{
return N;
}
return getRightCircleIndex(number, N + 1);

} else
{
return getRightCircleIndex(number, N - 1);
}
}


long getStartNumber(long N)
{
return 4 * N * (N - 1) + 2;
}