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 

这是我的版本:

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);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值