寻找女王游戏的解决方案

时间:2017-09-30 23:05:37

标签: c

我正在为学校写一个项目,但我的检查功能有问题。我应该为每个NxN皇后游戏板找到一个解决方案。有一个函数check(int b[], int n)可以检查皇后是否共享一个列或对角线。我找到了错误的解决方案。我不知道出了什么问题。一些提示可能会有所帮助。

E.g。对于4x4皇后已经在数组中声明[0123],然后将位置洗牌并检查。如果找到解决方案,则返回1.我的代码将正确的解决方案[2031]标记为1,但也标记为1个其他错误的解决方案。

int check(int b[], int n)
{
    //use if else to check if found solution 1, no solution 0

    int i;
    int j;// = n-1;

    for(i=0; i <= n-1; i++)   //cols
    {
        for(j=i+1; j< n; j++)
        {
            if((b[i]==b[j])||(abs(b[i]-b[j]))==(abs(i-j)))
            {
                return 0;
            }
        }
        return 1;
    }
}

2 个答案:

答案 0 :(得分:1)

看起来你错放了return 1;它只在外部for循环的一次迭代后被击中。将它移到该循环的外部和下方应该可以解决您的问题。

答案 1 :(得分:1)

正如@frslm指出的那样,你的退货声明是错误的,它解决了你的问题。然而,我在以下代码中调查了一些案例(n=4n=5)的代码(因为您说问题仍然存在):

#include <stdio.h>
#include <math.h>
int check(int b[], int n)
{
//use if else to check if found solution 1, no solution 0

 int i;
 int j;// = n-1;

 for(i=0; i <= n-1; i++)   //cols
 {
     for(j=i+1; j< n; j++)
     {
         if((b[i]==b[j])||(abs(b[i]-b[j]))==(abs(i-j)))
         {
             return 0;
         }
     }    

 }
 return 1;
}

int main(void) {
   // your code goes here
    int a[5];
       int u,i,j,k,l,m,n=5;
    for(u=0;u<n;u++)
      {
          a[u]=0;
    }
    for(i=0;i<n;i++)
      {
          a[0]=((++a[0])%n);
          for(j=0;j<n;j++)
          {
              a[1]=((++a[1])%n);
              for(k=0;k<n;k++)
              {
                  a[2]=((++a[2])%n);
                  for(l=0;l<n;l++)
                      {
                          a[3]=((++a[3])%n);
                              {
                                  for(m=0;m<n;m++)
                                      {
                                          a[4]=((++a[4])%n);

 /* for(i=0;i<n;i++)             
  {
      for(j=0;j<n;j++)
      {
          for(k=0;k<n;k++)
          {
              a[j]=((++a[j])%n);
          */

                                  if(check(a,n))
                                  {
                                      printf("\n %d %d %d %d %d",a[0],a[1],a[2],a[3],a[4]);
                                  }
                              }
                          }
                      }
                  }
              }
     }
    return 0;
}

代码尚未针对NxN板进行优化。但是,它考虑了5x5董事会的所有案例。它提供了以下解决方案:

  

1 3 0 2 4

     

1 4 2 0 3

     

2 4 1 3 0

     

2 0 3 1 4

     

3 1 4 2 0

     

3 0 2 4 1

     

4 1 3 0 2

     

4 2 0 3 1

     

0 2 4 1 3

     

0 3 1 4 2

所有输出案例都满足约束条件。 如果这不能解决您的问题,请提供失败的案例。