gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:38:18 27 4
gpt4 key购买 nike

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

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

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

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com