Java教程

Java 中的奇数幻方

本文主要是介绍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 中的奇数幻方的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!