c语言随机生成数独且能调整难度
时间: 2023-08-25 17:19:08 浏览: 97
以下是使用C语言随机生成数独并调整难度的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 9
// 检查在第row行第col列插入数字val是否合法
int check(int board[N][N], int row, int col, int val) {
// 检查行和列
for (int i = 0; i < N; i++) {
if (board[row][i] == val || board[i][col] == val) {
return 0;
}
}
// 检查3x3方格
int r = row / 3 * 3;
int c = col / 3 * 3;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (board[r+i][c+j] == val) {
return 0;
}
}
}
return 1;
}
// 生成数独
void generate(int board[N][N]) {
srand(time(NULL)); // 初始化随机数种子
// 逐个填充数字
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
int val = rand() % 9 + 1; // 随机生成1-9的数字
while (!check(board, i, j, val)) { // 直到找到合法的数字
val = rand() % 9 + 1;
}
board[i][j] = val;
}
}
}
// 移除数字以调整难度
void remove_numbers(int board[N][N], int num) {
srand(time(NULL)); // 初始化随机数种子
while (num > 0) {
int i = rand() % N;
int j = rand() % N;
if (board[i][j] != 0) { // 只移除非空格
int val = board[i][j];
board[i][j] = 0;
// 检查是否有唯一解
int count = 0;
for (int k = 1; k <= 9; k++) {
if (check(board, i, j, k)) {
count++;
}
}
if (count != 1) { // 恢复数字
board[i][j] = val;
} else {
num--;
}
}
}
}
int main() {
int board[N][N] = {0};
generate(board); // 生成数独
remove_numbers(board, 40); // 移除40个数字以调整难度
// 输出数独
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
printf("%d ", board[i][j]);
}
printf("\n");
}
return 0;
}
```
此代码在生成数独后,通过移除数字来调整难度。移除数字时,先随机选择一个非空格,将其移除,并检查是否有唯一解,如果没有则恢复数字。重复此过程直到达到目标难度。
阅读全文