纵横图

来源:互联网 发布:电脑怎么设置网络限制 编辑:程序博客网 时间:2024/06/10 08:52

//纵横图:此例来源于趣味数学。
/*纵横图是由1到n的2次方的正整数构成的n*n矩阵,其每一行,
每一列和对角线上的和相等。
当n为奇数时,H.Coxeter给出了一个用于生产纵横图的简单规则:
首先,在首行的中间填1;然后向其左上方移动,按增序方式在
空格中填写数字;如果离开了方格,则认为正方形的同一行或
同一列的头尾是相连的;如果走到某个小方格,而该格已填了
数,那么就改走到原方格的下面一个方格,继续。
*/
#include <iostream>
#include <iomanip>
using namespace std;

void Magic(int n)
//Creating a magic square of size n, n being odd
{
 if(n%2==0)
 {
  cout << "n is even" << endl;
  return;
 }

 int **square = new int* [n];//指向数组的指针

 //动态二维数组
 for(int i=0; i<n; i++)
  square[i] = new int[n];
 for(i=0; i<n; i++)
  for(int j=0; j<n; j++)
   square[i][j]=0;

 square[0][(n-1)/2] = 1; //Middle of first row
 //(i, j) is the current position
 i = 0;
 int j = (n-1)/2, k, l;
 for (int key = 2; key <= n*n; key++)
 {
  //move up and left. The next two if statements
  //may be replaced by the % operation if -1% is
  //implemented to have value n-1
  k = (0 != i) ? (i-1) : (n-1);
  l = (0 != j) ? (j-1) : (n-1);
  if (square[k][l] != 0)
   i = (i+1) % n;
  else
  {
   i = k;
   j = l;
  }
  square[i][j] = key;
 }
 //Output the magic square
 for(i = 0; i < n; i++)
 {
  for(int j = 0; j < n; j++)
   cout << setw(5) << square[i][j];
  cout << endl << endl;
 }

 for(i = 0; i < n; i++)
 {
  delete [] square[i];
  square[i] = NULL;
 }
 delete [] square;
 square = NULL;
}

int main()
{
 Magic(9);

 return 0;

原创粉丝点击