用c++写一个求解九宫图的程序
时间: 2023-10-29 07:04:40 浏览: 137
以下是用 C 语言实现求解九宫图的程序:
```c
#include <stdio.h>
#include <stdbool.h>
#define SIZE 9 // 定义九宫图大小
int puzzle[SIZE][SIZE]; // 存储九宫图的二维数组
// 检查当前数字是否可放置在该位置
bool is_valid(int row, int col, int num) {
// 检查当前行和列是否有重复数字
for (int i = 0; i < SIZE; i++) {
if (puzzle[row][i] == num || puzzle[i][col] == num) {
return false;
}
}
// 检查当前宫格是否有重复数字
int start_row = row / 3 * 3;
int start_col = col / 3 * 3;
for (int i = start_row; i < start_row + 3; i++) {
for (int j = start_col; j < start_col + 3; j++) {
if (puzzle[i][j] == num) {
return false;
}
}
}
return true;
}
// 递归求解九宫图
bool solve(int row, int col) {
// 如果已经到达最后一个格子,返回 true 表示已经求解成功
if (row == SIZE) {
return true;
}
// 如果当前格子已经有数字,则跳过继续求解下一个格子
if (puzzle[row][col] != 0) {
if (col == SIZE - 1) {
return solve(row + 1, 0);
} else {
return solve(row, col + 1);
}
}
// 尝试在当前格子放置数字 1~9 中的一个
for (int i = 1; i <= 9; i++) {
if (is_valid(row, col, i)) {
puzzle[row][col] = i;
if (col == SIZE - 1) {
if (solve(row + 1, 0)) {
return true;
}
} else {
if (solve(row, col + 1)) {
return true;
}
}
puzzle[row][col] = 0;
}
}
return false;
}
int main() {
// 初始化九宫图
printf("请输入九宫图,空格用 0 表示:\n");
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
scanf("%d", &puzzle[i][j]);
}
}
// 求解九宫图
if (solve(0, 0)) {
printf("求解成功,结果为:\n");
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
printf("%d ", puzzle[i][j]);
}
printf("\n");
}
} else {
printf("无解!\n");
}
return 0;
}
```
在程序中,`puzzle` 数组用来存储九宫图,其中空白格用 `0` 表示。`is_valid` 函数用来检查当前数字是否可放置在该位置,`solve` 函数是递归求解九宫图的主要函数。程序先读入九宫图,然后调用 `solve` 函数求解,最后输出结果。如果求解成功,会输出求解后的九宫图;如果无解,会输出 "无解!"。
阅读全文