用C++产生简单、普通、困难三种难度的数独问题各10题
时间: 2023-06-11 20:07:41 浏览: 53
以下是使用 C 语言生成简单、普通、困难难度的数独问题各10题的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 9
#define M 3
void print_board(int board[][N]) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
printf("%d ", board[i][j]);
}
printf("\n");
}
printf("\n");
}
int is_valid(int board[][N], int row, int col, int num) {
for (int i = 0; i < N; i++) {
if (board[row][i] == num || board[i][col] == num) {
return 0;
}
}
int r = row / M * M;
int c = col / M * M;
for (int i = r; i < r + M; i++) {
for (int j = c; j < c + M; j++) {
if (board[i][j] == num) {
return 0;
}
}
}
return 1;
}
int solve_board(int board[][N], int row, int col) {
if (row == N) {
return 1;
}
if (col == N) {
return solve_board(board, row + 1, 0);
}
if (board[row][col] != 0) {
return solve_board(board, row, col + 1);
}
for (int num = 1; num <= N; num++) {
if (is_valid(board, row, col, num)) {
board[row][col] = num;
if (solve_board(board, row, col + 1)) {
return 1;
}
board[row][col] = 0;
}
}
return 0;
}
void remove_numbers(int board[][N], int difficulty) {
int count = difficulty == 0 ? 30 : difficulty == 1 ? 40 : 50;
while (count > 0) {
int row = rand() % N;
int col = rand() % N;
if (board[row][col] != 0) {
count--;
int temp = board[row][col];
board[row][col] = 0;
int temp_board[N][N];
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
temp_board[i][j] = board[i][j];
}
}
int solutions = 0;
solve_board(temp_board, 0, 0);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (temp_board[i][j] == 0) {
solutions++;
}
}
}
if (solutions != 1) {
board[row][col] = temp;
count++;
}
}
}
}
void generate_board(int board[][N], int difficulty) {
srand(time(NULL));
int temp_board[N][N];
do {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
temp_board[i][j] = 0;
}
}
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
int num = rand() % N + 1;
while (!is_valid(temp_board, i, j, num)) {
num = rand() % N + 1;
}
temp_board[i][j] = num;
}
}
} while (!solve_board(temp_board, 0, 0));
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
board[i][j] = temp_board[i][j];
}
}
remove_numbers(board, difficulty);
}
int main() {
int easy_boards[10][N] = {0};
int medium_boards[10][N] = {0};
int hard_boards[10][N] = {0};
for (int i = 0; i < 10; i++) {
generate_board(easy_boards[i], 0);
generate_board(medium_boards[i], 1);
generate_board(hard_boards[i], 2);
}
printf("Easy boards:\n");
for (int i = 0; i < 10; i++) {
printf("Board %d:\n", i + 1);
print_board(easy_boards[i]);
}
printf("Medium boards:\n");
for (int i = 0; i < 10; i++) {
printf("Board %d:\n", i + 1);
print_board(medium_boards[i]);
}
printf("Hard boards:\n");
for (int i = 0; i < 10; i++) {
printf("Board %d:\n", i + 1);
print_board(hard_boards[i]);
}
return 0;
}
```
在这个示例代码中,我们使用了回溯算法来生成数独问题,并使用随机算法来删除一定数量的数字以达到不同难度的要求。通过调用 `generate_board` 函数,我们可以生成不同难度的数独问题。在这个示例代码中,我们生成了 10 个简单难度、10 个普通难度和 10 个困难难度的数独问题,并将它们分别存储在 `easy_boards`、`medium_boards` 和 `hard_boards` 数组中。最后,我们打印出这些数独问题,以供查看和使用。