八皇后问题作为最经典的深搜问题,感觉比一些找路的问题还要难一点,还有回溯的问题
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int n,c[26],sum;
bool isTrue(int row,int col)
{
for(int i = 1; i < row; i++) //从第一列往已经添加的数的前一列检索,如果又不合适的,返回false,否则,返回true
if(c[i] == col || abs(i - row) == abs(c[i] - col))//分别是列和对角线
return false;
return true;
}
void dfs(int i)
{
if(i==n+1)//已经到了最底层的下一层,说明全部通过
sum++;
for(int j=1; j<=n; j++)//每行的每个元素的检索
{
if(isTrue(i,j))
{
c[i]=j;
dfs(i+1);
}
}
}
int main()
{
while(scanf("%d",&n)&&n)
{
sum = 0;
memset(c,-1,sizeof(c));
dfs(1);
printf("%d\n",sum);
}
}