n皇后问题:回溯的想法,有递归和迭代两种解法。递归更加简洁
//迭代解法
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
bool place(int k,int x[])//判断当前放的位置是否符合皇后互斥条件
{
for(int i = 0; i < k; i++)
{
if(x[i] == x[k] || abs(i-k) == abs(x[i]-x[k]))
return false;
}
return true;
}
void nqueen(int n, int x[])//n皇后函数,回溯法
{
int k = 0;
while(k>=0)
{
while(x[k]<n && !place(k,x))
{
x[k] = x[k]+1;
}
if(k == n-1 && x[k] < n)
{
for(int i = 0; i< n; i++)
{
cout << x[i] <<" ";
}
cout << endl;
sum++;
x[k] = x[k]+1;
}else if(k < n-1 && x[k] < n)
{
k = k+1;
}else
{
x[k] = 0;
k = k-1;
x[k]++;
}
}
}
int main()
{
int n;
cin >> n;
int *x = new int[n];
memset(x,0,n*sizeof(int));
nqueen(n,x);
cout << sum;//输出总共的结果数目
}
//递归方法
bool place(int k,int x[])
{
for(int i = 0; i < k; i++)
{
if(x[i] == x[k] || abs(i-k) == abs(x[i]-x[k]))
return false;
}
return true;
}
void BackTrace(int k, int n,int x[])
{
if(k >= n)
{
for(int i = 0; i < n ;i++)
{
cout << x[i] << " ";
}
cout <<endl;
return;
}
for(int i = 0 ; i < n;i++)
{
x[k] = i;
if(place(k,x))
{
BackTrace(k+1,n,x);
}
}
}
int main()
{
int n;
cin >> n;
int *x = new int[n];
memset(x,0,n*sizeof(int));
BackTrace(0,n,x);
}