皇后问题,求解!
皇后问题,用的回溯,为什么运行不显示结果?个人觉得是collide函因数的条件设置错误,使其返回的总是0,如果把return 0和return 1换位置,就可以打印,尽管是错误的结果。另外,http://blog.csdn.net/pinkrobin/article/details/5378702
我的代码和这个差在哪里?为什么这个就能运行?
#include<stdio.h>
#include <math.h>
#define N 18
#define X -1
int q[N],n;
int collide(int row,int col);
void print();
void clear();
void main()
{
int i=0,j=0,k=0;
clear();
printf("please enter the value of n:\n");
scanf("%d",&n);
while(i<n)
{
while(j<n)
{
//printf("%d %d,",i,j);
if(collide(i,j))
{
q[i]=j;
j=0;
break;
}
else j++;
}
if(q[i]==X)
{
if(i==0)
break;
else
{
i--;
j=q[i]+1;
q[i]=X;
continue;
}
}
if(i==n-1)
{
printf("第%d组结果:\n",++k);
print();
j=q[i]+1;
q[i]=X;
continue;
}
i++;
}
}
//================================
int collide(int row,int col)
{
int i;
for(i=0;i<n;i++)
{
//printf("%d %d,",q[i],col);
if (q[i]==col||abs(i-row)==abs(q[i]-col))
return 0;
}
return 1;
}
//===========================
void print()
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(q[i]!=j)printf("。");
else printf("?");
}
printf("\n");
}
}
//================================
void clear()
{
int *a;
for(a=q;a<q+N;a++)
*a=X;
}
[解决办法]
#define X -100000//这个定义的太小了,容易有误差
[解决办法]
楼主你你个例子参考对比一下
#include <stdio.h>#include <stdlib.h>#define ABS(x) ((x)>0?(x):-(x))#define MAXSIZE 100int queen[MAXSIZE];//记录queen的位置void printboard(int n);int trail(int row,int n);int place(int row,int col,int n);int main(){ int i,n; printf("输入棋盘大小?"); if (scanf("%d",&n)==0) return 0; for (i=0;i<n;i++) queen[i]=-1; trail(0,n); return 0;}int trail(int row,int n){ static ct=0; if (row>=n) { printf("第%d种解法\n",++ct); printboard(n); return 0; } int i; for (i=0;i<n;i++) { if (place(row,i,n)!=0) { queen[row]=i; trail(row+1,n); queen[row]=-1; } }}void printboard(int n){ int i,j; for (i=0;i<n;i++) { for (j=0;j<n;j++) printf("%-2c",queen[i]==j?'Q':'*'); printf("\n"); }}int place(int row,int col,int n){ if (queen[row]=!-1) return 0; int i; for (i=0;i<row;i++) { if (queen[i]==col || ABS(row-i)==ABS(queen[i]-col)) return 0; } return 1;}
[解决办法]
把
#define X -1
改为
#define X -10000