2015-04-21 35 views
-2
#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给出了该问题的所有可能解决方案。 我没有得到任何输出在屏幕上。请帮忙!

+0

请修复您的缩进。每行需要四个空格将文本格式化为代码,您甚至可以在不应该有任何C缩进的行上进行更多操作。 – unwind

+0

n,我和j没有初始化! – Zelldon

+3

你做了什么来发现问题? – Michas

回答

1

当您检查您的主板为feasability,你应该只检查是否已经放置在皇后行:

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; 
} 

对于每一行ii < row,有一个王后。所有其他行都没有皇后,并且它的价值是当它脱离循环时。我猜测对角线检查有时是非常正确的,会缩短完美有效的女王位置。

与其寻找每一行的皇后,你可以检查三个路径 - 向上伸直,左斜线(l)和右对角线(r)的所有行:

int feasible(int row, int col) 
{ 
    int l = col; 
    int r = col; 

    while (row--) { 
     l--; r++; 

     if (a[row][col] == 'Q') return 0; 
     if (l >= 0 && a[row][l] == 'Q') return 0; 
     if (r < n && a[row][r] == 'Q') return 0; 
    } 

    return 1; 
} 

另一种方式来表示板是保持每个文件的女王的排名,这样你就不必搜索。尽管如此,这将使印刷板稍微复杂一些。