首页 > 试题广场 >

奇数幻方

[问答题]

奇数幻方

内容:

把整数1到n 2 (n为奇数)排成一个n×n方阵,使方阵中的每一行、每一列以及对角线上的数之和都相同。这样的方阵(行列数相等的矩阵称为方阵)称为n阶奇数幻方。

研究发现,n阶奇数幻方可以按下列方法生成:
把数1填在第一行的正中间(a[1,n div 2 +1]),然后用一个循环依次填入数2到n 2 。一边填数以便找下一个数应该在的位置,填数按照下面的规律进行:
如果数k填在第i行第j列的格子中(a[i,j]),那么一般情况下,数k+1应填在它的左上方,即a[i-1,j-1]位置上;但是,如果左上方无格子(越界了,即i-1为0或j-1为0),那么就做如下处理:若i-1为0,那么就填在a[n,j-1];若j-1为0,那么就填在a[i-1,n]。如果找到的格子中已填过数了,那么数k+1改填在第k个数的正下方(a[i+1,j])。

输入说明:

一行n,不需要判错n<=11

输出说明:

每行一个组n整数共n行

输入样例:

若题目没有特别说明,则应该以多组测试数据方式读取,或者参考a001。

3

输出样例:

6 1 8

7 5 3

2 9 4

#include<iostream>
using namespace std;
int main()
{
 int n,i,j,a[100][100]={0},h,l;
 cin>>n;
 h=1;l=n/2+1;
 a[h][l]=1;
 for (i=2;i<=n*n;i++)
   {
   	if (i%n!=1)
   	{
  	h--;
  	if (h==0) h=n;
l--;
if (l==0) l=n; 
   	}
   	if (i%n==1)
   	h++;
   	a[h][l]=i;
   }
 for (i=1;i<=n;i++)
   {
   for (j=1;j<=n;j++)
     cout<<a[i][j]<<' ';
   cout<<endl;
   }
 return 0;
}

void magic(int n) {
    int i = 0, j = n / 2;
    int k;
    int arr[n][n];
    for (k = 1; k <= n * n; ++k) {
        arr[i][j] = k;
        if (k % n == 0) {
            i++;
        } else {
            i = (i - 1 + n) % n;
            j = (j - 1 + n) % n;
        }
    }
    for (int l = 0; l < n; ++l) {
        for (int m = 0; m < n; ++m) {
            cout << arr[l][m] << " ";
        }
        cout << endl;
    }
}

发表于 2021-06-20 12:22:42 回复(0)