该程序仅解决第一行 [sudoku]
The program solve just first row [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;
}
当我试图编写一个解决数独的程序时,我的代码中有一个错误。
我的程序可以运行,但效果不佳。它正在解决程序中的第一行。
我认为我在那行代码上犯了错误:
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;
}