private int[][] data;
private int index;
private int direct;
public static void main(String[] args) {
SnakeMatrix s = new SnakeMatrix(50);
s.print();
}
public SnakeMatrix(int i) {
if (i < 1) {
System.out.println("參數錯誤");
System.exit(0);
}
index = i;
data = new int[i][i];
for (int j = 0; j < i; j++) {
for (int k = 0; k < i; k++) {
data[j][k] = 0;
}
}
direct = 0;
// manageData();
manageDataByMath();
}
public void manageDataByMath() {
for (int i = 0; i < index; i++) {
for (int j = 0; j < index; j++) {
data[i][j] = getDataByPosition(i, j);
}
}
}
public int getLevByPosition(int i, int j) {
int mid = (int) index / 2;
int tempi, tempj;
if ((i + 1) > mid) {
tempi = index - i - 1;
} else {
tempi = i;
}
if ((j + 1) > mid) {
tempj = index - j - 1;
} else {
tempj = j;
}
if (tempi < tempj)
return tempi + 1;
return tempj + 1;
}
public int getDataByPosition(int i, int j) {
int lev = getLevByPosition(i, j);
// 每壹層左上角第壹個元素的值
int startIndex = 0;
// 計算這個值
for (int temp = 1; temp < lev; temp++) {
startIndex += ((index - 2 * temp) * 4 + 4);
}
return startIndex + getAdd(i, j, lev) + 1;
}
public int getAdd(int i, int j, int lev) {
int add = 0;
// 每壹層的邊長
int levEdge = index - 2 * (lev - 1);
if (i + 1 == (index - (lev - 1))) {
// 這壹層的倒數第壹行
add = 2 * levEdge - 1 + (index - lev - 1 - j);
} else if (i + 1 == lev) {
// 這壹層的第壹行
add = j - lev + 1;
} else {// 中間行
if (j > ((int) index / 2)) {
add = levEdge + i - lev;
} else {
add = levEdge + levEdge - 2 + levEdge + (index - lev - i - 1);
}
}
return add;
}
private void changeDirect() {
direct = (direct + 1) % 4;
}
private boolean check(int j, int k) {
if (direct == 0) {
if ((k + 1) == index) {
return false;
} else if (data[j][k + 1] != 0) {
return false;
}
} else if (direct == 1) {
if ((j + 1) == index) {
return false;
} else if (data[j + 1][k] != 0) {
return false;
}
} else if (direct == 2) {
if (k == 0) {
return false;
} else if (data[j][k - 1] != 0) {
return false;
}
} else {
if (j == 0) {
return false;
} else if (data[j - 1][k] != 0) {
return false;
}
}
return true;
}
public void manageData() {
int j = 0;
int k = 0;
data[j][k] = 1;
for (int i = 2; i < index * index + 1; i++) {
// 判斷能否合法賦值
while (!check(j, k)) {
changeDirect();
}
if (direct == 0) {
k++;
} else if (direct == 1) {
j++;
} else if (direct == 2) {
k--;
} else {
j--;
}
data[j][k] = i;
}
}
public void print() {
for (int i = 0; i < index; i++) {
for (int j = 0; j < index; j++) {
if (data[i][j] < 10) {
} else if (data[i][j] > 99) {
} else {
System.out.print(" " + data[i][j]);
}
}
System.out.println();
}
}
}