本文虽然是个人书写,但是,部分内容参见了刘汝佳前辈的《算法竞赛入门金典》,其余为个人观点!
在我看了八皇后问题后,仔细琢磨了问题!可以使用回溯法!所谓回溯——递归函数将不再递归调用它自身,
而是返回上一层屌用,这中现象称为回溯! 正是因为这个原因,递归枚举算法常被称为回溯法,应用十分普遍!
s[a]==s[j]表示列相等, abs(a-j)==abs(s[a]-s[j])表示斜线相等!因为是一行一行的排皇后的,所以就不必考虑行相等了!
下面我用dfs回溯!
#include<iostream>
#include<math.h>
using namespace std;
int sum,s[15],n,b[15],p;
void dfs(int a)
{
if(a-1==p) // 递归边界,到了这里即说明最后一个皇后已经进入棋盘,所以不冲突
sum++; // 即sum加1,
else
for(int i=1;i<=p;i++)
{
int flag=1;
s[a]=i; //尝试把第a行的皇后放在第i列;
for(int j=1;j<=a-1;j++) //检查是否和前面的皇后冲突!
{
if(s[a]==s[j]||abs(a-j)==abs(s[a]-s[j]))
{
flag=0;break;
}
}
if(flag) //如果合法,继续递归!
dfs(a+1);
}
}
int main()
{
//运用打表!不打表会超时,
for(int j=1;j<=10;j++)
{
sum=0;
p=j;
dfs(1);
b[j]=sum;
}
while(cin>>n&&n)
cout<<b[n]<<endl;
return 0;
}