-1

私が作成したこのコードをデバッグしようとしていますが、配列の最初の行に 1 のみを出力し、他のすべての要素はゼロです (2 行目から最後の要素まで)。配列を渡す関数呼び出しの問題ですか?値または他の何かによって。助けていただければ幸いです。

#include<stdio.h>
#include<stdlib.h>

int isSafe(int x, int y, int a[][8])
{ int i,j;

//for left check of the cols
for(i=0;i<y;i++)
{
 if(a[x][i]==1)
 return 0;
}

  //for check of left upper diagonals
  for (i = x, j = y; i >= 0 && j >= 0; i--, j--)
  {
    if(a[i][j]==1)
    return 0;
  }

   //for check of left lower diagonals
     for(i = x, j = y; i<=7 && j>=0; i++,j--)
     {
      if(a[i][j]==1)
      return 0;
     }

return 1;
}//close isSafe

int EQueen(int a[][8], int q)
{
int c=0;
  if(q==8)
  return 1;

  else
  {
  while(c<=7)
  {
    if(isSafe(q,c,a)==1)
    { 
     a[c][q] = 1;
       if(EQueen(a,q+1)==1)
       return 1;

       else
       a[c][q] = 0;

    }//close if

    c++;          
  }//close while
  return 0;

  }//close else


}//close EQueen

int main()
{
int i,j,chess[8][8] = {[0 ... 7][0 ... 7] = 0};



if(EQueen(chess,0)==1)
{

for(i=0;i<8;i++)
{
    for(j=0;j<8;j++)
    printf("%d ",chess[i][j]);

    printf("\n");
}
}

return 0;
}//close main
4

2 に答える 2

1

c 変数がインクリメントされていないためだと思います。これは、EQueen 関数を再帰的に呼び出す方法によるものです。

if(q==8)
return 1;

q 変数が 8 に等しい場合、EQueen のその関数呼び出しの特定の呼び出しは 1 を返します。その後、EQueen の先行するすべての関数呼び出しは、すべてバックトラックして値 1 を返すため、if ステートメントに対して true になります。関数呼び出しのそのインスタンスを終了します。

if(EQueen(a,q+1)==1)
   return 1;
else ...

これにより、isSafe 関数は 0 番目の行 (c = 0) のみを調べるようになります。これは、EQueen がループする前に関数を終了するため、c 変数が 2x2 次元配列内のすべてのスペースをチェックするためにインクリメントされないためです。

于 2013-12-18T07:33:18.293 に答える