-1
私はsudokuを解決するプログラムを作ろうとしているとき、私は自分のコードにバグがあります。プログラムはちょうど最初の行を解決する[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);
}
TL; DR。 [mcve]を提供し、[ask]を参照してください。あなたは2D配列を使用しない理由は何ですか?それはずっと簡単に考えられますか?そして、 'malloc'の結果をC言語でキャストしないでください。また、あなたのコードには何らかの手掛かりがありません。メモリを取得しないと、yyourコードは未定義の動作を呼び出します。 – Olaf
そして言語を選んでください! CとC++は異なる言語です。それがC++でなければならない場合は、まず良い本を手に入れて言語を学んでください。良いc本も傷つきません。ストリームの 'write'とmagic numbersを使うことは、Cでも悪い習慣です。 – Olaf