//纵横图:此例来源于趣味数学。
/*纵横图是由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;
}