【问题标题】:8Queen code not working8皇后密码不起作用
【发布时间】:2013-12-18 06:34:01
【问题描述】:

我一直在尝试调试我制作的这段代码,它在数组的第一行只输出 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

【问题讨论】:

    标签: c arrays function recursion recursive-backtracking


    【解决方案1】:

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

    选择一致的命名法xic 等等,当你检查板时你会发现你的索引错误。将调用IsSafe改为

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

    它会起作用的。

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

    【讨论】:

    • 如果我在两行中将语句 a[c][q] 更改为 a[q][c] 并保持函数调用相同,它将每行的第一个元素输出为 1。虽然我的想法是对的。现在哪里缺?
    • 知道了,我没有在 isSafe 中检查皇后范围的所有 8 个位置。
    【解决方案2】:

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

    if(q==8)
    return 1;
    

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-27
      • 1970-01-01
      • 1970-01-01
      • 2012-07-12
      • 1970-01-01
      • 2020-04-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多