用C++产生简单、普通、困难三种难度的数独问题各10题
时间: 2023-06-11 13:07:37 浏览: 34
以下是用C语言实现简单、普通、困难三种难度的数独问题各10题的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 9
#define M 3
// 生成随机数
int rand_int(int min, int max) {
return min + rand() % (max - min + 1);
}
// 初始化数独数组
void init(int sudoku[N][N]) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
sudoku[i][j] = 0;
}
}
}
// 打印数独
void print(int sudoku[N][N]) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
printf("%d ", sudoku[i][j]);
}
printf("\n");
}
}
// 检查在指定位置放置数字是否合法
int is_valid(int sudoku[N][N], 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 row_start = (row / M) * M;
int col_start = (col / M) * M;
for (int i = row_start; i < row_start + M; i++) {
for (int j = col_start; j < col_start + M; j++) {
if (sudoku[i][j] == num) {
return 0;
}
}
}
return 1;
}
// 在指定位置放置数字
int place_num(int sudoku[N][N], int row, int col, int num) {
if (!is_valid(sudoku, row, col, num)) {
return 0;
}
sudoku[row][col] = num;
return 1;
}
// 生成数独
void generate(int sudoku[N][N], int level) {
int count = 0;
switch (level) {
case 0:
count = 30;
break;
case 1:
count = 20;
break;
case 2:
count = 10;
break;
default:
count = 0;
break;
}
// 初始化数独
init(sudoku);
// 随机填充数字
int row, col, num;
for (int i = 0; i < count; i++) {
do {
row = rand_int(0, N - 1);
col = rand_int(0, N - 1);
num = rand_int(1, 9);
} while (!place_num(sudoku, row, col, num));
}
}
int main() {
srand((unsigned int)time(NULL));
int sudoku[N][N];
printf("简单难度:\n");
for (int i = 0; i < 10; i++) {
generate(sudoku, 0);
print(sudoku);
printf("\n");
}
printf("普通难度:\n");
for (int i = 0; i < 10; i++) {
generate(sudoku, 1);
print(sudoku);
printf("\n");
}
printf("困难难度:\n");
for (int i = 0; i < 10; i++) {
generate(sudoku, 2);
print(sudoku);
printf("\n");
}
return 0;
}
```
这段代码中,使用了一个 `rand_int` 函数来生成指定范围内的随机数。初始化数独数组的函数为 `init`,打印数独的函数为 `print`。在 `generate` 函数中,根据指定的难度等级来确定需要填充的数字数量,然后使用 `place_num` 函数随机填充数字。最后,通过循环调用 `generate` 函数生成一定数量的数独问题,并使用 `print` 函数打印出来。