题目:用回溯法求解N皇后问题。
程序代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;
int count = 0;
//判定两个皇后是否在同一列或在同一斜线上
bool Place(int k, int i, int *x)
{
for(int j = 0; j < k; j++)
if((x[j] == i) || (abs(x[j] - i) == abs(j - k)))
return false;
return true;
}
//递归函数(求解n皇后问题)
void NQueens(int k, int n, int *x)
{
for(int i = 0; i < n; i++) //显式约束的第一种观点,x[k] = 0,1,···,n-1
{
if(Place(k, i, x)) //约束函数
{
x[k] = i;
if(k == n - 1)
{
for(i = 0; i < n; i++)
cout << x[i] << " "; //输出一个可行解
cout << endl;
count ++;
}
else
{
NQueens(k + 1, n, x); //深度优先进入下一层
}
}
}
}
void NQueens(int n, int *x)
{
NQueens(0, n, x);
}
int main()
{
int queens[8]; //8皇后
count = 0;
for(int i = 0; i < 8; i++)
queens[i] = -1;
NQueens(8, queens);
cout << "The result is: " << count << endl;
return 0;
}
实验结果
输出8皇后的可行解
再输出结果为:92