C 数独网格生成器

C 数独网格生成器,c,grid,sudoku,C,Grid,Sudoku,我刚刚开始制作我的数独游戏,我制作了这个函数grid,用于创建6x6数独网格。我对每个单元格中的不同数字使用了rand()函数(目前它只检查行中的数字重复)rand()还用于每个网格中随机数目的空单元格 问题在于,有时网格是完美的6x6,并且没有任何数字重复(仅在行中),但是,有时在某些单元格中会生成垃圾值,有时会增加列数。我不明白是什么导致了这个问题 守则: #include <stdio.h> #include <stdlib.h> #include <time

我刚刚开始制作我的数独游戏,我制作了这个函数
grid
,用于创建
6x6
数独网格。我对每个单元格中的不同数字使用了
rand()
函数(目前它只检查行中的数字重复)
rand()
还用于每个网格中随机数目的空单元格

问题在于,有时网格是完美的
6x6
,并且没有任何数字重复(仅在行中),但是,有时在某些单元格中会生成垃圾值,有时会增加列数。我不明白是什么导致了这个问题

守则:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void grid(void) {
    int cell[6][6], row, col, s, i, j;
    char in = 'A';
    srand(time(NULL));
    for (row = 0; row <= 5; row++) {
        printf("\t\t\t[ |");
        for (col = 0; col <= 5; col++) {
            s = rand() % 6 + 1;
            if (s % 2 == 0)
            {
                cell[row][col] = rand() % 6 + 1;
                for (j = 0; j<col; j++) {
                    if (cell[row][j] == cell[row][col]) {
                        col--;
                        continue;
                    }
                }
            }
            else { printf("   | ", in++); continue; }
            printf(" %d | ", cell[row][col]);
        }
        printf("]\n\n");
    }
}

int main()
{
    grid();
}
#包括
#包括
#包括
空心网格(空心){
int单元格[6][6],行、列、s、i、j;
char in='A';
srand(时间(空));

对于(row=0;row),您发布的代码中有太多语法错误,而且格式非常糟糕。请尝试编辑它,以便我们可以帮助您

col--; 这可能是您的问题,因为如果您在
for(col=0;col<6;col++)
循环中执行
col--;
,您将执行6次以上的迭代


我知道这个问题很老了,但这里的一位评论员说至少要等一个小时

要直接回答您的问题:

  • 获取垃圾值是因为在!
    (s%2==0)
    时未为
    单元格设置值
  • 由于
    c--
    语句导致
    col
    循环执行6次以上(并且每次都打印f),因此每行可以获得6个以上的条目

  • 如果要保持逻辑的一般结构,请分两次执行此操作-完全填充
    单元格
    ,然后打印整个内容。但是,还有其他问题。您可能希望完全删除
    s%2==0
    检查,第一次
    继续
    可能是
    中断
    (如果你真的想惹人生气的话,也可以打一个
    goto
    ).

    您使用的Pico缩进样式可能适合Pico,但C不是Pico。请使用正统的C-我更喜欢Allman,但许多人更喜欢1TB的一些变体。坚持使用其中一种或另一种,您不会犯太大的错误。在6x6数独板中,您通常有6个2行3列的子单元格,并且您必须保留e每个子单元格以及每行和每列中6个数字的唯一性。您的代码似乎不足以满足这些条件。在9x9板中,您将有9个子单元格,每个大小为3x3,每个子单元格以及每行和每列中的数字都是唯一的。我想知道随机排列数组是否会做得更好共6项?(我还没有编写数独生成器;我不知道最好的方法。但是有将近700个问题被标记了!)欢迎使用Stack Overflow。我同意问题中的代码不可读。但是,你最好等到你有足够的声誉(50分)时再做注释而不是添加注释作为“答案”。
    col--
    不是一个大问题;这是一种返回并在所选数字已被使用时再次尝试生成一个数字的方法。该代码在算法中可能不正确,但
    col--
    本身并不是一个自动问题。我如何在ut回应?(诚实的问题而不是讽刺)并对错误的答案表示歉意:/3获得声誉的主要途径有三个:(1)提出好问题;(2)给出好答案;(3)对被认为是好的问题或答案进行编辑。你应该找到一个你知道的问题或能找到答案的问题——也许是一个被忽视了一个小时或更长时间的问题,这样你就不会与FGITW(西方最快的枪)竞争了人群-并提供一个很好的答案。通常,这会为你赢得一些声誉。谢谢你的建议:)