Java 中的奇数幻方
作者:互联网
目前还不清楚是谁首先提出了一个魔方。很久以前,中国有一个大洪水的故事。人们担心他们会被冲走,并试图通过祭祀来安抚河神。直到一个孩子注意到一只乌龟背上有一个魔方,它一直围绕着牺牲品,似乎什么都没有用。广场告诉人们他们需要做出多大的牺牲才能自救。从那时起,魔方就成为任何挑剔的乌龟的时尚高度。
级别:初学者
重点:逻辑、数组、方法
奇数魔方
如果您以前从未遇到过,幻方是将连续数字排列在一个正方形中,这样行、列和对角线的总和就是相同的数字。例如,一个 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);
}
}
标签:Java,magicSq,奇数,int,幻方,column,size,row 来源: https://blog.csdn.net/allway2/article/details/120807616