在C中生成有效的数独谜题
我试着用C语言生成一个有效的数独游戏,当我编译时,什么都没有发生,我认为有一个无限循环,但我不知道它是从哪里来的!我想我需要帮助!在我的推理中,我试图: 随机抽取任意数字1-9。 检查放入单元格是否安全。(行、列和框) 如果安全,将其放置并递增到下一个位置,然后转至步骤1。 如果不安全,则在不增加的情况下转到步骤1。 一旦矩阵完全填满,随机移除k个元素以完成游戏。 这是我的密码在C中生成有效的数独谜题,c,arrays,algorithm,sudoku,C,Arrays,Algorithm,Sudoku,我试着用C语言生成一个有效的数独游戏,当我编译时,什么都没有发生,我认为有一个无限循环,但我不知道它是从哪里来的!我想我需要帮助!在我的推理中,我试图: 随机抽取任意数字1-9。 检查放入单元格是否安全。(行、列和框) 如果安全,将其放置并递增到下一个位置,然后转至步骤1。 如果不安全,则在不增加的情况下转到步骤1。 一旦矩阵完全填满,随机移除k个元素以完成游戏。 这是我的密码 #include <stdio.h> #include <stdlib.h> #include
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <time.h>
#include <math.h>
#define N 9 // row and col
#define SRN 3 // square and row
#define K 20 //missing digits
int mat[N][N];
bool unUsedInBox(int rowStart, int colStart, int num) {
for (int i = 0; i < SRN; i++)
for (int j = 0; j < SRN; j++)
if (mat[rowStart + i][colStart + j] == num)
return false;
return true;
}
int randomGenerator(int num) {
srand(time(NULL));
return (int) ( rand() % num ) + 1;
}
bool unUsedInRow(int i, int num) {
for (int j = 0; j < N; j++)
if (mat[i][j] == num)
return false;
return true;
}
// check in the row for existence
bool unUsedInCol(int j, int num) {
for (int i = 0; i < N; i++)
if (mat[i][j] == num)
return false;
return true;
}
bool CheckIfSafe(int i, int j, int num) {
return (unUsedInRow(i, num) &&
unUsedInCol(j, num) &&
unUsedInBox(i - i % SRN, j - j % SRN, num));
}
void fillBox(int row, int col) {
int num;
for (int i = 0; i < SRN; i++) {
for (int j = 0; j < SRN; j++) {
do {
num = randomGenerator(N);
}
while (!unUsedInBox(row, col, num));
mat[row + i][col + j] = num;
}
}
}
void fillDiagonal() {
for (int i = 0; i < N; i = i + SRN)
fillBox(i, i);
}
bool fillRemaining(int i, int j) {
if (j >= N && i < N - 1) {
i = i + 1;
j = 0;
}
if (i >= N && j >= N)
return true;
if (i < SRN) {
if (j < SRN)
j = SRN;
} else if (i < N - SRN) {
if (j == (int)(i / SRN) * SRN)
j = j + SRN;
} else {
if (j == N - SRN) {
i = i + 1;
j = 0;
if (i >= N)
return true;
}
}
for (int num = 1; num <= N; num++) {
if (CheckIfSafe(i, j, num)) {
mat[i][j] = num;
if (fillRemaining(i, j + 1))
return true;
mat[i][j] = 0;
}
}
return false;
}
void removeKDigits() {
int count = K;
while (count != 0) {
int cellId = randomGenerator(N * N);
int i = (cellId / N);
int j = cellId % 9;
if (j != 0)
j = j - 1;
if (mat[i][j] != 0) {
count--;
mat[i][j] = 0;
}
}
}
void fillValues() {
// Fill the diagonal of SRN x SRN matrices
fillDiagonal();
// Fill remaining blocks
fillRemaining(0, SRN);
// Remove Randomly K digits to make game
removeKDigits();
}
void printSudoku() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++){
printf("%d",mat[i][j]);
printf(" ");
}
printf("\n");
}
printf("\n");
}
int main() {
fillValues();
printSudoku();
}
#包括
#包括
#包括
#包括
#包括
#定义n9//行和列
#定义SRN 3//正方形和行
#定义k20//缺少的数字
国际材料[N][N];
bool unUsedInBox(int rowStart、int colStart、int num){
对于(int i=0;i=N&&i=N&&j>=N)
返回true;
如果(i=N)
返回true;
}
}
对于(int num=1;num,无限循环可能是由以下原因引起的:
int randomGenerator(int num) {
srand(time(NULL));
return (int) ( rand() % num ) + 1;
}
因为srand
被调用来生成每个“随机”数,所以相同的数将被一次又一次地生成。因为该数已经在使用,所以循环while(!unUsedInBox(row,col,num));
将永远循环(或者至少直到time(NULL)
返回一个新值)。因此每秒(关于时间的结果)会有一步的进步,然后又需要一秒的时间,等等,似乎是无限的
(参见一些程序员的评论)无限循环可能是由以下原因引起的:
int randomGenerator(int num) {
srand(time(NULL));
return (int) ( rand() % num ) + 1;
}
因为srand
被调用来生成每个“随机”数,所以相同的数将被一次又一次地生成。因为该数已经在使用,所以循环while(!unUsedInBox(row,col,num));
将永远循环(或者至少直到time(NULL)
返回一个新值)。因此每秒(关于时间的结果)会有一步的进步,然后又需要一秒的时间,等等,似乎是无限的
(见一些程序员的评论)首先,只调用srand
一次。或者不要使用默认的随机变量,这很糟糕。我认为有一个无限循环,但我不知道它从哪里来!-这是调试器可以提供帮助的地方。我投票关闭这个问题,因为OP需要使用调试器:OP成功使用调试器后找出程序循环的位置,问为什么会循环是合适的,但这是一个单独的问题。首先,只调用srand
一次。或者不使用默认的随机变量,这很糟糕。我认为有一个无限循环,但我不知道它从哪里来!-这是调试器可以提供帮助的地方。我投票决定不讨论这个问题,因为OP需要使用调试器:在OP成功使用调试器并找到程序循环的位置后,问题为什么会发生是合适的,但这将是一个单独的问题。小调:解析(未签名)时间
通常比17ms多1秒,仍然是UVMinor:(无符号)时间
的分辨率通常比17ms多1秒,仍然是UV