我正在为学校写一个项目,但我的检查功能有问题。我应该为每个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;
}
}
答案 0 :(得分:1)
看起来你错放了return 1
;它只在外部for循环的一次迭代后被击中。将它移到该循环的外部和下方应该可以解决您的问题。
答案 1 :(得分:1)
正如@frslm指出的那样,你的退货声明是错误的,它解决了你的问题。然而,我在以下代码中调查了一些案例(n=4
和n=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
所有输出案例都满足约束条件。 如果这不能解决您的问题,请提供失败的案例。