该程序只解决了第一行[sudoku]

时间:2016-07-16 11:51:06

标签: 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);
}

1 个答案:

答案 0 :(得分: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;
}