用c语言编写数独
时间: 2023-10-22 10:04:55 浏览: 39
好的,这里提供一个简单的 C 语言代码示例,可以生成和解决数独。代码中使用了回溯算法求解数独,实现方法与前面提供的代码示例类似。
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// 定义数独的大小
#define N 9
// 定义数独
int sudoku[N][N] = {
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0},
{0, 0, 0, 0, 0, 0, 0, 0, 0}
};
// 判断某个数是否可以填入某个位置
int can_place(int row, int col, int num) {
// 判断当前行是否有相同数字
for (int i = 0; i < N; i++) {
if (sudoku[row][i] == num) {
return 0;
}
}
// 判断当前列是否有相同数字
for (int i = 0; i < N; i++) {
if (sudoku[i][col] == num) {
return 0;
}
}
// 判断当前子矩阵是否有相同数字
int sub_row = (row / 3) * 3; // 子矩阵的起始行号
int sub_col = (col / 3) * 3; // 子矩阵的起始列号
for (int i = sub_row; i < sub_row + 3; i++) {
for (int j = sub_col; j < sub_col + 3; j++) {
if (sudoku[i][j] == num) {
return 0;
}
}
}
return 1;
}
// 随机填入数字
int fill_random(int row, int col) {
if (row >= N) {
return 1;
}
int arr[N] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
for (int i = 0; i < 9; i++) {
int j = rand() % 9;
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
for (int i = 0; i < N; i++) {
int num = arr[i];
if (can_place(row, col, num)) {
sudoku[row][col] = num;
if (col < N - 1) {
if (fill_random(row, col + 1)) {
return 1;
}
} else {
if (fill_random(row + 1, 0)) {
return 1;
}
}
sudoku[row][col] = 0;
}
}
return 0;
}
// 求解数独
int solve_sudoku(int row, int col) {
// 如果当前行和列都大于等于 N,说明已经解出数独
if (row >= N && col >= N) {
return 1;
}
// 如果当前列大于等于 N,换行
if (col >= N) {
row++;
col = 0;
}
// 如果当前位置已经填有数字,跳过
if (sudoku[row][col] != 0) {
return solve_sudoku(row, col + 1);
}
// 尝试填入数字
for (int i = 1; i <= N; i++) {
if (can_place(row, col, i)) {
sudoku[row][col] = i;
// 递归求解下一个位置
if (solve_sudoku(row, col + 1)) {
return 1;
}
// 如果无解,回溯
sudoku[row][col] = 0;
}
}
// 如果所有数字都不能填入当前位置,无解
return 0;
}
// 输出数独
void print_sudoku() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
printf("%d ", sudoku[i][j]);
}
printf("\n");
}
}
int main() {
// 随机生成数独
srand((unsigned int) time(NULL));
fill_random(0, 0);
// 输出数独
printf("随机生成的数独为:\n");
print_sudoku();
// 求解数独
if (solve_sudoku(0, 0)) {
// 输出结果
printf("数独的解为:\n");
print_sudoku();
} else {
// 无解
printf("无解!\n");
}
return 0;
}
```
这个代码可以随机生成数独,并使用回溯算法求解数独。生成数独的方法与前面提供的代码示例类似,不同的是它是随机填入数字,而不是从输入中读取数字。