用java寫一個奇數魔方陣
阿新 • • 發佈:2018-11-02
魔方陣即下圖所示
一個矩陣,每行每列及對角線相加的值都相等,稱之為魔方陣
魔方陣填寫規則:
1、"1"寫在第一行最中間的位置
2、由“1”開始。按順序填寫,每次填寫位置為當前位置的上一行,下一列
在填寫過程中會遇到幾種問題:
以上四種情況中紅框表示當前位置上一行下一列所在地,但是會發現每種情況都會越界,所以陣列中如何放入該值已寫明
由寫入步驟可知在編寫程式碼時會遇到四種情況,為了程式碼書寫的方便,可概括如下:
當遇到這種情況:i值必小於0,j值在陣列範圍內,即j < array[i].length;加粗紅框為最特殊的情況,i<0,j >= array[i].length
這種情況i必大於0,而j值有兩種情況:j>=array[i].length或者j<array[i].length
知道了有以上四種情況,則可以由此寫出魔方陣程式碼,如下:
public class TestDemo {
public static void rubiksCube(int[][] array, int n) {
int i = 0;
int j = array[i].length >> 1;
array[i][j] = 1;
for (int number = 2; number <= n * n; number++) {
i--;
j++;
if (i >= 0) {
if (j >= array[i].length) {//j >= 3
j = 0;
} else {//j < 3
if (array[i][j] != 0) {
i += 2;
j--;
}
}
array[i][j] = number;
} else {
if (j > n - 1) {//i < 0,不能用array[i].length比較
i += 2;
j--;
} else {
i = array.length - 1;//i移動到最後一行
}
array[i][j] = number;
}
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[][] array = new int[n][n];
rubiksCube(array, n);
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[i].length; j++) {
System.out.print(array[i][j] + " ");
}
System.out.println();
}
System.out.println("==================deepToString================");
System.out.println();
System.out.println(Arrays.deepToString(array));
}
}
簡化
public class TestDemo {
public static void magicScqure(int[][] array,int n) {//3 1- 9
array[0][n/2] = 1;
int prevRow = 0;
int prevCol = n/2;
for(int i = 2;i <= n*n;i++) {
if(array[(prevRow-1+n)%n][(prevCol+1)%n] != 0) {
//上一行的下一列沒有資料
prevRow = (prevRow+1)%n;//下一行
} else {
prevRow = (prevRow-1+n)%n;
prevCol = (prevCol+1)%n;
}
array[prevRow][prevCol] = i;
}
}
public static void main(String[] args) {
int row = 5;
int[][] array = new int[row][row];
magicScqure(array,row);
System.out.println(Arrays.deepToString(array));
}
}