题意:n个皇后不在同一行同一列有多少种放法
思路:dfs搜索所有情况,因为每行必有一个所以行数就不用看,用num[i]保存列号i就是行号,搜一种放法判断是否符合条件(n皇后不在同一行同一列上)
符合条件sum++,最后输出sum的值即可
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
int n;
int sum = 0;
int map[15][15];
int visit[15];
int num[15];
void dfs(int nsum)
{
if(nsum == n)
{
int i,j;
for(i = 0; i < n; i++)
{
for(j = i+1;j < n; j++)
{
if(num[i] == num[j] || abs(j-i) == abs(num[i]-num[j]) )
return ;
}
}
sum++;
}
int i;
for(i = 0; i < n; i++)
{
if(!visit[i])
{
visit[i] = 1;
num[nsum] = i;
dfs(nsum+1);
num[nsum] = 0;
visit[i] = 0;
}
}
}
int main()
{
while(scanf("%d",&n) != EOF)
{
memset(visit,0,sizeof(visit));
sum = 0;
if(n == 0)
break;
dfs(0);
printf("%d\n",sum);
}
return 0;
}