帮我看看N皇后问题这个程序哪里出错了啊

来源:百度知道 编辑:UC知道 时间:2024/05/27 07:34:27
#include<stdio.h>
#include<math.h>
int k=0,a[20],j=1,flag,n,c=0;//k为解的个数,n为皇后的个数,flag标记有没有放置皇后
void lycQueen(){//递归求解函数
int i,h;//i为行号,h为列号
for(h=1;h<=n;h++){
a[j]=h;
for(i=1;i<j;i++){//将第j个皇后的位置依次跟前面j-1个皇后比较
if(a[i]==a[j]||abs(a[j]-a[i])==abs(j-i)) {flag=0;break;}//两个皇后在同一行或者同一对角线上,冲突
else flag=1;//没冲突,放置一个皇后
}//for
if(flag==0&&a[j]!=n) continue;//没试探完,继续试探
if(flag==1&&j==n){//放置完n个皇后,得到一个解
k=k+1;c=1;//解的个数加1
for(i=1;i<=n;i++)
printf("%d ",a[i]);//输出第i个皇后放置的行号
printf("\n");
}//if
if(flag==1&&j!=n){j++;lycQueen();}//递归调用
if(flag==0&&a[j]==n){j--;}//回溯,退回去重新试探
}//for
}//lycQueen

void main(){
int i;
printf("请输入皇后的个数:");
scanf("%d",&n);//输入皇后的个数n
j=1;
for(i=1;i<=n;i++){
a[j]=i;
j=j+1;
lycQueen();//调用lycQueen函数
if

看了好久你的程序,终于发现了错误。(看别人的程序太恼火了)
当最后一个皇后放在合适的位置时,先进入(flag==1&&j==n)的条件,输出结果,这时flag==1,继续最后一个皇后寻找位置,找不到。进入(flag==0&&a[j]==n),前一个皇后寻找位置。但当最后一个皇后放在右下角的位置时,先输出结果,这时flag还是==1,但已经找到最后一个位置,无法将flag=0,所以无法进入(flag==0&&a[j]==n),所以再继续寻找就出错了。只要在后面加上"if(a[j] == n) flag=0"就行。
下面是用你的程序改的:
#include<stdio.h>
#include<math.h>
int k=0,a[20],j=1,flag,n,c=0;//k为解的个数,n为皇后的个数,flag标记有没有放置皇后
void lycQueen(){//递归求解函数
int i,h;//i为行号,h为列号
for(h=1;h<=n;h++){
a[j]=h;
for(i=1;i<j;i++){//将第j个皇后的位置依次跟前面j-1个皇后比较
if(a[i]==a[j]||abs(a[j]-a[i])==abs(j-i)) {flag=0;break;}//两个皇后在同一行或者同一对角线上,冲突
else flag=1;//没冲突,放置一个皇后
}//for
if(flag==0&&a[j]!=n) continue;//没试探完,继续试探
if(flag==1&&j==n){//放置完n个皇后,得到一个解
k=k+1;c=1;//解的个数加1
for(i=1;i<=n;i++)
printf("%d ",a[i]);//输出第i个皇后放置的行号
printf("\n");
if(a[j] == n)
flag = 0;
}