读书人

皇后有关问题求解

发布时间: 2012-04-17 15:06:33 作者: rapoo

皇后问题,求解!
皇后问题,用的回溯,为什么运行不显示结果?个人觉得是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;
}

[解决办法]

C/C++ code
#define X -100000//这个定义的太小了,容易有误差
[解决办法]
楼主你你个例子参考对比一下
C/C++ code
#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

读书人网 >C语言

热点推荐