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坐標(biāo)是(0,0),2是(0,1),3是(1,1),4是(1,0),5是(-1,-1)……
現(xiàn)給出a點坐標(biāo)(x,y) 求a點數(shù)值?
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)); //坐標(biāo)所在的是第幾圈 0、1、2、3……
long start = 4 * CircleN * (CircleN - 1) + 2; //所在圈最小的那個數(shù)字,即左上角右邊那個數(shù)字
//根據(jù)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;
}
}
另外附加反向問題代碼,己知一個點的數(shù)值,求出這個點的坐標(biāo):

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平方根的整數(shù)部分
long CircleN = getRightCircleIndex(number, startCircleN); //求出number在第幾圈
long start = getStartNumber(CircleN); //所在圈最小的那個數(shù)字,即左上角右邊那個數(shù)字
long distance = number - start;
long sideLen = 2 * CircleN + 1; //一條邊上有幾個數(shù)字
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;
}
* java 打印螺旋狀數(shù)字
* @author Administrator
*
*/
public class PMart {
public static void main(String args[]) {
int n = 5;
int i;
int j;
int mat[][] = new int[n][n];
int k = 0;
for (i = 0; i < (n + 1) / 2; i++) {
for (j = i; j <= n - 1 - i; j++) {
mat[i][j] = ++k;
}
for (j = i + 1; j <= n - 1 - i; j++) {
mat[j][n - i - 1] = ++k;
}
for (j = n - i - 2; j >= i; j--) {
mat[n - i - 1][j] = ++k;
}
for (j = n - i - 2; j > i; j--) {
mat[j][i] = ++k;
}
}
for (i = 0; i < mat.length; i++) {
for (j = 0; j < mat[i].length; j++) {
System.out.print("\t" + mat[i][j]);
}
System.out.println("\r\n\r\n");
}
}
}
謝謝