n皇后
#include<stdio.h>
#include<math.h>
int main()
{
int place(int x[],int k);
void Nqueens(int x[],int t,int n);
int n,x[30],i;
scanf("%d",&n);
Nqueens(x,1,n);
getchar();
}
int place(int x[],int k)
{
int i;
for( i=1;i<k;i++)
if(x[i]==x[k]||(fabs(x[i]-x[k])==fabs(i-k)))
return 0;
return 1;
}
void Nqueens(int x[],int t,int n)
{
int i;
if(t>n)
{
for(i=1;i<=n;i++)
{
if(i!=n)
printf("%d ",x[i]);
else
printf("%d",x[i]);
}
printf("\n");
}
else
{
for(i=1;i<=n;i++)
{
x[t]=i;
if(place(x,t))
Nqueens(x,t+1,n);
}
}
}
2n皇后
先放白的,放完后放黑的
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<math.h>
int n,so[100],ans,a[100][100],ko[100];
int count=0;
int dfs2(int k)
{
int i;
int j;
for(i =0; i < k -1; i++)
{
int judge = ko[i]- ko[k -1];
if(judge ==0|| fabs(k -1- i)== fabs(judge))
return 0;
}
if(k == n)
{
count++;
return 0;
}
for( j =0; j < n; j++)
{
if(j != so[k]&& a[k][j])//黑白皇后不能重复放在一个格子
{
ko[k]= j;
dfs2(k +1);
}
}
}
int dfs1(int k)
{
int i;
int j;
for( i =0; i < k -1; i++)
{
int judge = so[i]- so[k -1];
if(judge ==0|| fabs(k -1- i)== fabs(judge))
return 0;
}
if(k == n)
{
dfs2(0);
return 0;
}
for( j =0; j < n; j++)
{
if(a[k][j])
{
so[k]= j;
dfs1(k +1);
}
}
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&a[i][j]);
//memset();
ans=0;
dfs1(0);
printf("%d\n",count);
}