c - 该程序仅解决第一行[数独]

标签 c pointers matrix multidimensional-array sudoku

当我尝试编写一个解决数独问题的程序时,我的代码中有一个错误。

我的程序可以运行,但运行效果不佳。它只解决程序中的第一行。

我认为我在那行代码上犯了错误:

int ft_rezolva(int **t)
{
    int i;
    int j;
    int n;

    if(!ft_loc_gol(t, &i, &j))
        return (1);
    n = 0;
    while(++n < 10)
    {
        if (ft_is_ok(t, i, j, n))
        {
            t[i][j] = n;

            if (ft_rezolva(t))
                return (1);
            t[i][j] = 0;
        }
    }
    return (0);
}

但我不知道。

这是整个代码:

#include <stdlib.h>
#include <unistd.h>

int ft_is_ok(int **t, int i, int j, int n);
int ft_loc_gol(int **t, int *i, int *j);

void    ft_putchar(char c)
{
    write(1, &c, 1);
}

int     **ft_alocare(int n)
{
    int i;
    int **tab;

    i = -1;
    tab = (int**)malloc(n * n * sizeof(int*));
    while (++i < n)
        tab[i] = (int*)malloc(n * sizeof(int));
    return(tab);
}

int ft_rezolva(int **t)
{
    int i;
    int j;
    int n;

    if(!ft_loc_gol(t, &i, &j))
        return (1);
    n = 0;
    while(++n < 10)
    {
        if (ft_is_ok(t, i, j, n))
        {
            t[i][j] = n;

            if (ft_rezolva(t))
                return (1);
            t[i][j] = 0;
        }
    }
    return (0);
}

int ft_loc_gol(int **t, int *i, int *j)
{
    *i = -1;
    *j = -1;

    while(++*i < 9)
        while(++*j < 9)
            if(t[*i][*j] == 0)
                return (1);
    return (0);
}

int ft_in_rind(int **t, int i, int n)
{
    int j;

    j = -1;
    while (++j < 9)
        if(t[i][j] == n)
            return (1);
    return (0);
}

int ft_in_col(int **t, int j, int n)
{
    int i;

    i = -1;
    while (++i < 9)
        if (t[i][j] == n)
            return (1);
    return (0);
}

int ft_3x3(int **t, int iS, int jS, int n)
{
    int i;
    int j;

    i = -1;
    j = -1;
    while (++i < 3)
        while (++j < 3)
            if (t[i + iS][j + jS] == n)
                return (1);
    return (0);

}

int ft_is_ok(int **t, int i, int j, int n)
{
    return !ft_in_rind(t, i, n)
        && !ft_in_col(t, j, n)
        && !ft_3x3(t, i - i % 3, j - j % 3, n);
}

void    ft_print(int **t)
{
    int i;
    int j;

    i = -1;
    while (++i < 9)
    {
        j = -1;
        while(++j < 9)
        {
            ft_putchar(t[i][j] + '0');
            if(j == 8)
                ft_putchar('\n');
            else
                ft_putchar(' ');
        }
    }
}

int main(int argc, char **argv)
{
    int **tablou;
    int i = 0;
    int n = 0;
    int j;

    tablou = ft_alocare(9);
    if(argc == 10)
        while(++i  < argc)
        {
            j = -1;
            while(argv[i][++j])
                if(argv[i][j] == '.')
                    tablou[n][j] = 0;
                else
                    tablou[n][j] = argv[i][j] - '0';
            n++;
        }
    else
        write(1, "Erreur\n", 7);
    if (ft_rezolva(tablou) == 1)
        ft_print(tablou);
    else
        write(1, "Erreur\n", 7);
    return (0);
}

最佳答案

您查找空单元格的函数不正确,您必须为外循环的每次迭代重置*j:

int ft_loc_gol(int **t, int *i, int *j) {
    for (*i = 0; *i < 10; *i += 1) {
        for (*j = 0; *j < 10; *j += 1) {
            if (t[*i][*j] == 0)
                return 1;
        }
    }
    return 0;
}

关于c - 该程序仅解决第一行[数独],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38410922/

相关文章:

c++ - 使用 STL std::sort 的方式作为 qsort_r

c - 为什么不能将静态结构指针初始化为变量的地址

matlab - 如何将 double 值转换为索引整数以在 MATLAB 中创建稀疏矩阵?

c++ - 从 CvPoint2D32f 的 C++ vector 创建 CvMat

c - 我 undefined reference 已定义

c - 变量类型如何影响 C 中的指针算术工作?

c++ - 无法将结构的项目复制到另一个结构中

python - 如何在python中将给定的随机生成的字母打印成矩阵的形式

matlab - 非破坏性地更改矩阵中的值

c - pragma omp for 没有性能