我的代码中n queen拼图的错误是什么?

时间:2015-04-21 13:36:31

标签: c debugging n-queens

#include <stdio.h>
#include <math.h>
char a[10][10];
int n;
int feasible(int row,int col)
{
    int i,j,tcol;
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            if(a[i][j]=='Q')
                break;
        }
        tcol=j;
        if(col==tcol || abs(row-i)==abs(col-tcol))
            return 0;
    }
    return 1;
}
void nqueen(int row)
{
    int i,j;
    if(row<n)
    {
        for(i=0;i<n;i++)
        {
            if(feasible(row,i))
            {
                a[row][i]='Q';
                nqueen(row+1);
                a[row][i]='.';
            }
        }
    }
    else
    {
        printf("\nThe solution is:\n");
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                printf("%c\t",a[i][j]);
            }
            printf("\n\n");
        }
    }
}
            int main()
{
    int i,j;
    printf("Enter the number of queens:");
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            a[i][j]='.';
        }
    }
    nqueen(0);
    getch();
    return 0;
}

可行的功能是检查是否可以将一个女王放在行中。专栏已通过。

函数nqueen为问题提供了所有可能的解决方案。 我没有在屏幕上显示任何输出。请帮忙!

1 个答案:

答案 0 :(得分:1)

当你检查你的电路板是否可行时,你应该只检查你已经放置了皇后的行:

int feasible(int row, int col)
{
    int i, j, tcol;

    for (i = 0; i < row; i++) {
        for (j = 0; j < n; j++) {
            if (a[i][j] == 'Q') break;
        }
        tcol = j;

        if (col==tcol || abs(row - i) == abs(col - tcol))
            return 0;
    }
    return 1;
}

对于i的{​​{1}}行,有一个女王。所有其他行还没有皇后,i < row等于tcol,这是它从循环中掉落时的值。我猜对角线检查有时候是意外的,切断一个完美有效的女王放置时间。

不是在每一行中找到女王,而是可以检查所有行的三条路径 - 直线向上,左对角线(n)和右对角线(l):

r

代表董事会的另一种方法是保持每个文件的女王等级,这样你就不必搜索了。不过,这将使印刷板更加复杂。