【算法之美-经典问题】九宫格问题
题目
九宫格是一种古老的数学游戏,它要求在3X3的矩阵中,填入1-9这9个数字,并且横向、纵向、斜向上的3个数字之和皆相等。类似问题在数学上被称为幻方。现将九宫格推广到5X5,7X7等幻方问题。根据求解口诀““一居上行正中央,依次斜填切莫忘;上出框时向下放,右出框时向左放;排重便在下格填,右上排重一个样”。所谓一居上行正中央说的是1在第一行的正中,依次 斜填切莫忘说的是一直向右上方填, 上出框时往下填是斜填到方框上面去了,就放在这竖行的最下边, 右出框时左边放是说斜填到右框外面,就在横行左边放, 排重便在下格填是斜填上面有数字了,就在自己的下面放, 右上排重一个样就是右上格上面没有格子了,就和排重一样,放在自己的下面。
根据一个用户输入的奇数,作为幻方矩阵的大小输出一个对应的矩阵。
解答
#include <iostream>
#include <memory>
#include <iomanip>
using namespace std;
int main(){
int n;
cin >> n;
cout << endl;
int **a = new int *[n];
for (int i = 0; i < n; i++)
{
a[i] = new int [n];
memset(a[i], 0, n * sizeof(int));
}
int row = 0, col = n / 2;
for (int i = 1; i <= n*n; i++)
{
a[row][col] = i;
row--;
col++;
if (row < 0 && col >= n)
{
row += 2;
col--;
}
else if (row < 0)
{
row = n - 1;
}
else if (col >= n)
{
col = 0;
}
if (a[row][col] != 0)
{
row += 2;
col--;
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cout << setw(6) << a[i][j] << " ";
}
cout << endl;
}
for (int i = 0; i < n; i++)
{
delete[] a[i];
}
delete[] a;
return 0;
}
测试结果
5
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
请按任意键继续. . .