目前还不清楚是谁首先提出了一个魔方。很久以前,中国有一个大洪水的故事。人们担心他们会被冲走,并试图通过祭祀来安抚河神。直到一个孩子注意到一只乌龟背上有一个魔方,它一直围绕着牺牲品,似乎什么都没有用。广场告诉人们他们需要做出多大的牺牲才能自救。从那时起,魔方就成为任何挑剔的乌龟的时尚高度。
级别:初学者
重点:逻辑、数组、方法
如果您以前从未遇到过,幻方是将连续数字排列在一个正方形中,这样行、列和对角线的总和就是相同的数字。例如,一个 3x3 幻方是:
8 1 6
3 5 7
4 9 2
每行、每列和对角线加起来为 15。
此编程练习与创建奇数大小的幻方有关(即,方的大小只能是奇数、3x3、5x5、7x7、9x9 等)。制作这样一个正方形的技巧是将数字 1 放在第一行和中间列。要找到放置下一个数字的位置,请向右斜向上移动(即向上一行,跨一列)。如果这样的移动意味着您从正方形上掉下来,请绕到对面的行或列。最后,如果移动将您带到一个已经填满的方格,请返回原来的方格并向下移动一个。重复这个过程,直到所有的方块都被填满。
例如,一个 3x3 的幻方会像这样开始:
0 1 0
0 0 0
0 0 0
对角向上移动意味着我们绕到正方形的底部:
0 1 0
0 0 0
0 0 2
同样,下一个对角线向上移动意味着我们绕到第一列:
0 1 0
3 0 0
0 0 2
现在对角线向上移动会产生一个已经被填满的正方形,所以我们回到我们原来的地方并下拉一行:
0 1 0
3 0 0
4 0 2
它会一直持续下去,直到所有的方块都填满为止。
问题是你的程序可以创建一个像下面这样的 5x5 幻方吗?
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
提示:除了这个练习的编程方面,它也是一个逻辑测试。依次执行创建幻方的每一步,并弄清楚如何使用二维数组来完成。
您的程序应该能够创建下面的 5x5 幻方:
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
这是我的版本:
import java.util.Scanner; public class MagicOddSquare { public static void main(String[] args) { Scanner input = new Scanner(System.in); int[][] magicSquare; boolean isAcceptableNumber = false; int size = -1; // only accept odd numbers while (isAcceptableNumber == false) { System.out.println("Enter in size of square: "); String sizeText = input.nextLine(); size = Integer.parseInt(sizeText); if (size % 2 == 0) { System.out.println("The size must be an odd number"); isAcceptableNumber = false; } else { isAcceptableNumber = true; } } input.close(); magicSquare = createOddSquare(size); displaySquare(magicSquare); } private static int[][] createOddSquare(int size) { int[][] magicSq = new int[size][size]; int row = 0; int column = size / 2; int lastRow = row; int lastColumn = column; int matrixSize = size * size; magicSq[row][column] = 1; for (int k = 2; k < matrixSize + 1; k++) { // check if we need to wrap to opposite row if (row - 1 < 0) { row = size - 1; } else { row--; } // check if we need to wrap to opposite column if (column + 1 == size) { column = 0; } else { column++; } // if this position isn't empty then go back to where we // started and move one row down if (magicSq[row][column] == 0) { magicSq[row][column] = k; } else { row = lastRow; column = lastColumn; if (row + 1 == size) { row = 0; } else { row++; } magicSq[row][column] = k; } lastRow = row; lastColumn = column; } return magicSq; } private static void displaySquare(int[][] magicSq) { int magicConstant = 0; for (int j = 0; j < (magicSq.length); j++) { for (int k = 0; k < (magicSq[j].length); k++) { System.out.print(magicSq[j][k] + " "); } System.out.println(); magicConstant = magicConstant + magicSq[j][0]; } System.out.print("The magic constant is " + magicConstant); } }