请用C++来实现:输入一个正整数 N,即幻方的大小,且1≤N≤39 ,N为奇数。输出:共 N 行,每行 N 个整数,即按上述方法构造出的N×N 的幻方,相邻两个整数之间用单空格隔开
时间: 2024-10-28 16:06:23 浏览: 6
为了实现这个功能,你可以使用嵌套循环来创建矩阵,并根据给定的规则动态填充数字。以下是使用C++编写的示例代码:
```cpp
#include <iostream>
using namespace std;
// 功能:根据幻方规则填充一个二维数组
void fillSudoku(int N, int grid[N][N]) {
int num = (N * N + 1) / 2; // 中心位置的数字
grid[0][N / 2] = num;
num--;
for (int i = 1; i < N; ++i) {
for (int j = 0; j < N; ++j) {
if (grid[i][j] == 0) { // 空位
int row = i, col = j;
if (row == 0 || col == N - 1) {
if ((col == N - 1 && grid[row + 1][col] != 0) ||
(row == 0 && grid[row][col - 1] != 0)) {
// 检查行首列尾或行尾列首
if (row == 0)
--col;
else
--row;
} else {
// 正下方或正上方未填过
if (row > 0 && col < N - 1 && grid[row - 1][col + 1] == 0)
--row;
else
--col;
}
} else {
// 对于内部位置,优先寻找右上方
if (grid[row][col + 1] != 0)
--col;
else if (grid[row + 1][col] != 0)
--row;
else if (grid[row - 1][col] != 0)
++row;
else if (grid[row][col - 1] != 0)
++col;
}
grid[i][j] = num++;
}
}
}
}
// 显示幻方
void printSudoku(int N, int grid[N][N]) {
for (int i = 0; i < N; ++i) {
for (int j = 0; j < N; ++j) {
cout << grid[i][j] << (j < N - 1 ? " " : "\n");
}
}
}
int main() {
int N;
cout << "Enter the size of the magic square (an odd number between 1 and 39): ";
cin >> N;
if (N < 1 || N > 39 || N % 2 == 0) {
cerr << "Invalid input. Please enter an odd number between 1 and 39.\n";
return 1;
}
int grid[N][N];
fillSudoku(N, grid);
printSudoku(N, grid);
return 0;
}
```
在这个程序中,`fillSudoku`函数用于填充幻方矩阵,`printSudoku`函数用于显示结果,`main`函数获取用户输入并调用这两个函数。记得输入的 N 必须是 1 到 39 之间的奇数。运行此程序时,会提示用户输入幻方的大小,然后输出对应的幻方矩阵。
阅读全文