2016-07-16 4 views
-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); 
} 
+1

TL; DR。 [mcve]を提供し、[ask]を参照してください。あなたは2D配列を使用しない理由は何ですか?それはずっと簡単に考えられますか?そして、 'malloc'の結果をC言語でキャストしないでください。また、あなたのコードには何らかの手掛かりがありません。メモリを取得しないと、yyourコードは未定義の動作を呼び出します。 – Olaf

+0

そして言語を選んでください! CとC++は異なる言語です。それがC++でなければならない場合は、まず良い本を手に入れて言語を学んでください。良いc本も傷つきません。ストリームの 'write'とmagic numbersを使うことは、Cでも悪い習慣です。 – Olaf

答えて

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; 
} 
関連する問題