题目:
给定一个奇数n,比如n=3,生成1到n平方的数,如1到9,填入九宫格,使得横竖斜的和都相等。
思想:
n奇数幻方口诀:
1. 数字1放在第一行中间
2. 依次放在上一个数的右上角
2.1如果右边出去了就回到左边(3,4)
2.2 如果上面出去了就放下面(1,2)
2.3 如果右上角有了就放在这个数的下面(参考5,6)
例如:n=3
8 1 6
3 5 7
4 9 2
注意:
二维数组的动态申请与释放的方法
代码:
#include <iostream>
#include <stdlib.h>
using namespace std;
void sudoku(int n)
{
/*动态申请一个二维数组*/
int **ptr;
ptr= new int *[n];
for (int i = 0; i < n; i++)
{
ptr[i] = new int[n];
}
/*对二维数组做初始化操作*///注意此处不能使用memset函数初始化,因为采用上述方法申请的二维数组是由n的不连续的n大小的空间组成的。
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
ptr[i][j] = 0;
}
}
//memset(ptr, 0, n*n);
int i = 0;
int j = n / 2;
ptr[i][j] = 1;
for (int k = 2; k <= n*n; k++)
{
int i1, j1;
i1 = i; //记录当前的i,j以免右上角已经有数,直接放在当前数的下方
j1 = j; //
i--;
j++;
if (i < 0 )//如果上面出去了就放下面
{
i = n - 1;
}
if (j >( n - 1))//如果右边出去了就回到左边
{
j = 0;
}
if (ptr[i][j]!=0)//如果右上角有了就放在这个数的下面
{
ptr[i1 + 1][j1] = k;
i = i1+1;//注意更新i,j的值
j = j1;
}
else if (ptr[i][j]==0)
{
ptr[i][j] = k;
}
}
for (int i = 0; i < n; i++)//输出
{
for (int j = 0; j < n; j++)
{
cout << ptr[i][j] << " ";
}
cout << endl;
}
for (int i = 0; i < n; i++) //释放内存
{
delete[] ptr[i];
}
delete ptr;
}
int main()
{
int n;
cin >> n;
sudoku(n);
system("pause");
return 0;
}