魔方|奇数阶

A. 魔方 n阶是n的排列 2. 一个正方形中的数,通常是不同的整数,所有行、列和两条对角线中的n个数之和为同一常数。幻方包含从1到n的整数 2. . 每行、每列和每对角线中的常数和称为 魔常数或魔和 ,M.正规幻方的幻方常数仅取决于n,且具有以下值: M=n(n 2. +1)/2

null
For normal magic squares of order n = 3, 4, 5, ...,the magic constants are: 15, 34, 65, 111, 175, 260, ... 

在这篇文章中,我们将讨论如何通过编程生成大小为n的幻方。这种方法只考虑n的奇数,而不适用于偶数。在进一步研究之前,请考虑下面的例子:

Magic Square of size 3-----------------------  2   7   6  9   5   1  4   3   8Sum in each row & each column = 3*(32+1)/2 = 15Magic Square of size 5----------------------  9   3  22  16  15  2  21  20  14   8 25  19  13   7   1 18  12   6   5  24 11  10   4  23  17Sum in each row & each column = 5*(52+1)/2 = 65Magic Square of size 7---------------------- 20  12   4  45  37  29  28 11   3  44  36  35  27  19  2  43  42  34  26  18  10 49  41  33  25  17   9   1 40  32  24  16   8   7  48 31  23  15  14   6  47  39 22  21  13   5  46  38  30Sum in each row & each column = 7*(72+1)/2 = 175

你有没有发现数字的存储模式?

在任何幻方中,第一个数字即1存储在位置(n/2,n-1)。让这个位置为(i,j)。下一个数字存储在位置(i-1,j+1),在这里我们可以把每个行和列看作圆形数组,即它们环绕。

有三个条件: 1.上一个数字的行号减1,上一个数字的列号增1,计算出下一个数字的位置。在任何时候,如果计算的行位置变为-1,它将环绕到n-1。类似地,如果计算出的列位置变为n,它将环绕为0。 2.如果幻方在计算位置已经包含一个数字,则计算列位置将减少2,计算行位置将增加1。 3.如果计算的行位置为-1,计算的列位置为n,则新位置为:(0,n-2)。

Example:Magic Square of size 3---------------------- 2  7  6 9  5  1 4  3  8 Steps:1. position of number 1 = (3/2, 3-1) = (1, 2)2. position of number 2 = (1-1, 2+1) = (0, 0)3. position of number 3 = (0-1, 0+1) = (3-1, 1) = (2, 1)4. position of number 4 = (2-1, 1+1) = (1, 2)   Since, at this position, 1 is there. So, apply condition 2.   new position=(1+1,2-2)=(2,0)5. position of number 5=(2-1,0+1)=(1,1)6. position of number 6=(1-1,1+1)=(0,2)7. position of number 7 = (0-1, 2+1) = (-1,3) // this is tricky, see condition 3    new position = (0, 3-2) = (0,1)8. position of number 8=(0-1,1+1)=(-1,2)=(2,2) //wrap around9. position of number 9=(2-1,2+1)=(1,3)=(1,0) //wrap around

基于上述方法,以下是工作代码:

C++

// C++ program to generate odd sized magic squares
#include <bits/stdc++.h>
using namespace std;
// A function to generate odd sized magic squares
void generateSquare( int n)
{
int magicSquare[n][n];
// set all slots as 0
memset (magicSquare, 0, sizeof (magicSquare));
// Initialize position for 1
int i = n / 2;
int j = n - 1;
// One by one put all values in magic square
for ( int num = 1; num <= n * n;) {
if (i == -1 && j == n) // 3rd condition
{
j = n - 2;
i = 0;
}
else {
// 1st condition helper if next number
// goes to out of square's right side
if (j == n)
j = 0;
// 1st condition helper if next number
// is goes to out of square's upper side
if (i < 0)
i = n - 1;
}
if (magicSquare[i][j]) // 2nd condition
{
j -= 2;
i++;
continue ;
}
else
magicSquare[i][j] = num++; // set number
j++;
i--; // 1st condition
}
// Print magic square
cout << "The Magic Square for n=" << n
<< ":Sum of "
"each row or column "
<< n * (n * n + 1) / 2 << ":" ;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++)
// setw(7) is used so that the matrix gets
// printed in a proper square fashion.
cout << setw(4) << magicSquare[i][j] << " " ;
cout << endl;
}
}
// Driver code
int main()
{
// Works only when n is odd
int n = 7;
generateSquare(n);
return 0;
}
// This code is contributed by rathbhupendra


C

// C program to generate odd sized magic squares
#include <stdio.h>
#include <string.h>
// A function to generate odd sized magic squares
void generateSquare( int n)
{
int magicSquare[n][n];
// set all slots as 0
memset (magicSquare, 0, sizeof (magicSquare));
// Initialize position for 1
int i = n / 2;
int j = n - 1;
// One by one put all values in magic square
for ( int num = 1; num <= n * n;) {
if (i == -1 && j == n) // 3rd condition
{
j = n - 2;
i = 0;
}
else {
// 1st condition helper if next number
// goes to out of square's right side
if (j == n)
j = 0;
// 1st condition helper if next number
// is goes to out of square's upper side
if (i < 0)
i = n - 1;
}
if (magicSquare[i][j]) // 2nd condition
{
j -= 2;
i++;
continue ;
}
else
magicSquare[i][j] = num++; // set number
j++;
i--; // 1st condition
}
// Print magic square
printf ( "The Magic Square for n=%d:Sum of "
"each row or column %d:" ,
n, n * (n * n + 1) / 2);
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++)
printf ( "%3d " , magicSquare[i][j]);
printf ( "" );
}
}
// Driver program to test above function
int main()
{
int n = 7; // Works only when n is odd
generateSquare(n);
return 0;
}


JAVA

// Java program to generate odd sized magic squares
import java.io.*;
class GFG {
// Function to generate odd sized magic squares
static void generateSquare( int n)
{
int [][] magicSquare = new int [n][n];
// Initialize position for 1
int i = n / 2 ;
int j = n - 1 ;
// One by one put all values in magic square
for ( int num = 1 ; num <= n * n;) {
if (i == - 1 && j == n) // 3rd condition
{
j = n - 2 ;
i = 0 ;
}
else {
// 1st condition helper if next number
// goes to out of square's right side
if (j == n)
j = 0 ;
// 1st condition helper if next number is
// goes to out of square's upper side
if (i < 0 )
i = n - 1 ;
}
// 2nd condition
if (magicSquare[i][j] != 0 ) {
j -= 2 ;
i++;
continue ;
}
else
// set number
magicSquare[i][j] = num++;
// 1st condition
j++;
i--;
}
// print magic square
System.out.println( "The Magic Square for " + n
+ ":" );
System.out.println( "Sum of each row or column "
+ n * (n * n + 1 ) / 2 + ":" );
for (i = 0 ; i < n; i++) {
for (j = 0 ; j < n; j++)
System.out.print(magicSquare[i][j] + " " );
System.out.println();
}
}
// driver program
public static void main(String[] args)
{
// Works only when n is odd
int n = 7 ;
generateSquare(n);
}
}
// Contributed by Pramod Kumar


Python3

# Python program to generate
# odd sized magic squares
# A function to generate odd
# sized magic squares
def generateSquare(n):
# 2-D array with all
# slots set to 0
magicSquare = [[ 0 for x in range (n)]
for y in range (n)]
# initialize position of 1
i = n / / 2
j = n - 1
# Fill the magic square
# by placing values
num = 1
while num < = (n * n):
if i = = - 1 and j = = n: # 3rd condition
j = n - 2
i = 0
else :
# next number goes out of
# right side of square
if j = = n:
j = 0
# next number goes
# out of upper side
if i < 0 :
i = n - 1
if magicSquare[ int (i)][ int (j)]: # 2nd condition
j = j - 2
i = i + 1
continue
else :
magicSquare[ int (i)][ int (j)] = num
num = num + 1
j = j + 1
i = i - 1 # 1st condition
# Printing magic square
print ( "Magic Square for n =" , n)
print ( "Sum of each row or column" ,
n * (n * n + 1 ) / / 2 , "" )
for i in range ( 0 , n):
for j in range ( 0 , n):
print ( '%2d ' % (magicSquare[i][j]),
end = '')
# To display output
# in matrix form
if j = = n - 1 :
print ()
# Driver Code
# Works only when n is odd
n = 7
generateSquare(n)
# This code is contributed
# by Harshit Agrawal


C#

// C# program to generate odd sized magic squares
using System;
class GFG {
// Function to generate odd sized magic squares
static void generateSquare( int n)
{
int [, ] magicSquare = new int [n, n];
// Initialize position for 1
int i = n / 2;
int j = n - 1;
// One by one put all values in magic square
for ( int num = 1; num <= n * n;) {
if (i == -1 && j == n) // 3rd condition
{
j = n - 2;
i = 0;
}
else {
// 1st condition helper if next number
// goes to out of square's right side
if (j == n)
j = 0;
// 1st condition helper if next number is
// goes to out of square's upper side
if (i < 0)
i = n - 1;
}
// 2nd condition
if (magicSquare[i, j] != 0) {
j -= 2;
i++;
continue ;
}
else
// set number
magicSquare[i, j] = num++;
// 1st condition
j++;
i--;
}
// print magic square
Console.WriteLine( "The Magic Square for " + n
+ ":" );
Console.WriteLine( "Sum of each row or column "
+ n * (n * n + 1) / 2 + ":" );
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++)
Console.Write(magicSquare[i, j] + " " );
Console.WriteLine();
}
}
// driver program
public static void Main()
{
// Works only when n is odd
int n = 7;
generateSquare(n);
}
}
// This code is contributed by Sam007.


PHP

<?php
// php program to generate odd sized
// magic squares
// A function to generate odd sized
// magic squares
function generateSquare( $n )
{
// set all slots as 0
$magicSquare ;
for ( $i = 0; $i < $n ; $i ++)
for ( $j = 0; $j < $n ; $j ++)
$magicSquare [ $i ][ $j ] = 0;
// Initialize position for 1
$i = (int) $n / 2;
$j = $n - 1;
// One by one put all values in
// magic square
for ( $num = 1; $num <= $n * $n ; )
{
// 3rd condition
if ( $i == -1 && $j == $n )
{
$j = $n -2;
$i = 0;
}
else
{
// 1st condition helper if
// next number goes to out
// of square's right side
if ( $j == $n )
$j = 0;
// 1st condition helper if
// next number is goes to
// out of square's upper
// side
if ( $i < 0)
$i = $n -1;
}
// 2nd condition
if ( $magicSquare [ $i ][ $j ])
{
$j -= 2;
$i ++;
continue ;
}
else
// set number
$magicSquare [ $i ][ $j ] = $num ++;
// 1st condition
$j ++; $i --;
}
// Print magic square
echo "The Magic Square for n = " . $n
. ":Sum of each row or column "
. $n * ( $n * $n + 1) / 2;
echo "" ;
for ( $i = 0; $i < $n ; $i ++)
{
for ( $j = 0; $j < $n ; $j ++)
echo $magicSquare [ $i ][ $j ] . " " ;
echo "" ;
}
}
// Driver program to test above function
// Works only when n is odd
$n = 7;
generateSquare ( $n );
// This code is contributed by mits.
?>


Javascript

<script>
// javascript program to generate odd sized magic squares
// Function to generate odd sized magic squares
function generateSquare(n)
{
magicSquare = Array(n).fill(0).map(x => Array(n).fill(0));
// Initialize position for 1
var i = parseInt(n / 2);
var j = n - 1;
// One by one put all values in magic square
for (num = 1; num <= n * n;) {
if (i == -1 && j == n) // 3rd condition
{
j = n - 2;
i = 0;
}
else {
// 1st condition helper if next number
// goes to out of square's right side
if (j == n)
j = 0;
// 1st condition helper if next number is
// goes to out of square's upper side
if (i < 0)
i = n - 1;
}
// 2nd condition
if (magicSquare[i][j] != 0) {
j -= 2;
i++;
continue ;
}
else
// set number
magicSquare[i][j] = num++;
// 1st condition
j++;
i--;
}
// print magic square
document.write( "The Magic Square for " + n
+ ":<br>" );
document.write( "Sum of each row or column "
+ parseInt(n * (n * n + 1) / 2) + ":<br>" );
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++)
document.write(magicSquare[i][j] + " " );
document.write( "<br>" );
}
}
// driver program
// Works only when n is odd
var n = 7;
generateSquare(n);
// This code is contributed by 29AjayKumar
</script>


输出

The Magic Square for n=7:Sum of each row or column 175:  20   12    4   45   37   29   28   11    3   44   36   35   27   19    2   43   42   34   26   18   10   49   41   33   25   17    9    1   40   32   24   16    8    7   48   31   23   15   14    6   47   39   22   21   13    5   46   38   30 

时间复杂性: O(n) 2. )

辅助空间: O(n) 2. )

注: 这种方法只适用于n的奇数值。

参考资料: http://en.wikipedia.org/wiki/Magic_square

本文由 阿希什·巴恩瓦尔 并由Geeksforgeks团队审核。如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写评论

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享