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



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

我的程序正在工作,但效果不佳。它只是解决程序中的第一行。

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

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, "Erreurn", 7);
    if (ft_rezolva(tablou) == 1)
        ft_print(tablou);
    else
        write(1, "Erreurn", 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;
}

相关内容

  • 没有找到相关文章