给一个奇数阶N幻方,填入数字1,2,3…N*N,使得横竖斜方向上的和都相同

来源:互联网 发布:淘宝帐户无法登陆 编辑:程序博客网 时间:2024/04/30 04:05

/**************************************************************************/
/* 给一个奇数阶N幻方,填入数字1,2,3…N*N,使得横竖斜方向上的和都相同(腾讯)*/
/**************************************************************************/

 

#include <iostream>
#include <iomanip>
#include <cmath>

using namespace std;

void MagicCube(int n)
{
 int **Matr = new int *[n];
 for(int i=0;i<n;i++)
  Matr[i] = new int[n];
 int j = n/2; //j=n/2指的以首行中间数作为起点,即1所在的位置
 int num = 1;
 i = 0;
 while (num!=n*n+1)
 {
  //往右上角延升,若超出则用%转移到左下角
  Matr[(i%n+n)%n][(j%n+n)%n] = num;
  //斜行的长度是n,超出则转至下一斜行
  if(num%n==0)
   i++;
  else
  {
   i--;  //记录行
   j++;  //记录列
  }
  num++;
 }
 for(i=0;i<n;i++)
 {
  for(j=0;j<n;j++)
   cout<<setw((int)log10(n*n)+4)<<Matr[i][j]; //格式控制
  cout<<endl<<endl;   //格式控制
 }
 for(i=0;i<n;i++)
  delete []Matr[i];
}

int main()
{
 int n;
 cin>>n;
 MagicCube(n);
 return 1;
}