八皇后递归问题

来源:百度知道 编辑:UC知道 时间:2024/07/04 07:33:56
#include<iostream>
#include<stdio.h>
#include<math.h>
#define n 8
using namespace std;
int x[n+1],sum;
enum boolean {FALSE,TRUE};
typedef enum boolean Bool;
Bool place(int);
void backtrack(void);

int main()
{
int i;for(i=0;i<n;i++) x[i]=0;
backtrack();
cout<<"this is"<<n<<sum;
}

Bool place(int k)
{
int j;
for(j=1;j<k;j++)
if((abs(k-j)==abs(x[j]-x[k]))||(x[j]==x[k])
return FALSE;
return TRUE;
}
void backtrack()
{
int k=1;
while((x[k]<=n)&&!(place(k))
{x[k]+=1;
if(x[k]<=n)
if(k==n) sum++;
else
{k++;x[k]=0;}
else k--;}

这个叫回溯,不叫递归
Bool place(int k)
{
    int j;
    for(j=1;j<k;j++)
        if((abs(k-j)==abs(x[j]-x[k]))||(x[j]==x[k])
            return FALSE; /* 返回false表示此位置不能放皇后 */
    return TRUE; /* 返回true表示此位置能放皇后 */
}
(abs(k-j)==abs(x[j]-x[k]) 判断斜线上是否有皇后
(x[j]==x[k]) 判断水平线上是否有皇后

你看看你的程序,while((x[k]<=n)&&!(place(k)))这个循环条件当k = 1的时候就不成立。循环就进不去,还怎么运行?