-1

我一直在尝试调试我制作的这段代码,它在数组的第一行只输出 1,所有其他元素都为零(从第二行到最后一个元素。),是不是传递数组的函数调用问题按价值或其他方式。帮助表示赞赏。

#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

2

您的代码原则上很好。您只需要注意对整个行和列使用相同的索引。您打印电路板的方式,您使用chess[row][col].

选择一致的x、等命名法ic当您检查板时,您会发现您的索引错误。将呼叫更改IsSafe

if (isSafe(c, q, a) == 1) ...

它会起作用。

(顺便说一下,数组是通过引用传递的,因此反映了您所做的更改。这里没问题。)

于 2013-12-18T07:53:46.097 回答
1

我相信这是因为你的 c 变量没有增加。这是由于您递归调用 EQueen 函数的方式。

if(q==8)
return 1;

当您的 q 变量等于 8 时,对该 EQueen 的该函数调用的特定调用将返回 1。之后,所有前面的 EQueen 函数调用对于 if 语句都将为真,因为它们都将回溯并返回值 1并退出该函数调用的实例。

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

这使得您的 isSafe 函数仅查看第 0 行 (c = 0),因为您的 c 变量不会增加以检查 2x2 维数组中的所有空格,因为 EQueen 在循环之前退出了该函数。

于 2013-12-18T07:33:18.293 回答