//这里的n皇后问题是n*n的棋盘上,每一行都选一个位置上放置棋子,那么考虑一下,如果在n*n的棋盘上,放置m(m<n)个棋子,那该怎么编写?
//其实就在每一轮的dfs中的for循环后,填一个dfs就好,注意,此时的dfs的step就步加一了,代表这一轮没有选
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
const int N=1e5+5;
int n;
int len;
char s[20];
int t;
int x[20];//x数组表示,第i行(即x数组的下标),x[i]存储的是第i行的下标
int jieguo[20];
bool yes(int k)
{
for(int i=0;i<k;i++)
{
if(x[i]==x[k]||abs(i-k)==abs(x[i]-x[k]))
return false;
}
return true;
}
int dfs(int step)
{
int sum=0;
if(step==t)
return 1;
for(int i=0;i<t;i++)
{
x[step]=i;
if(yes(step))
sum+=dfs(step+1);
} //dfs(step); 这样 就表示这一轮没有选棋子
return sum;
}
int main(void)
{
for(t=1;t<11;t++)
{
jieguo[t]=dfs(0);
}
while(scanf("%d",&n))
{
if(n==0)
break;
//memset(x,0,sizeof(x));
// sum
printf("%d\n",jieguo[n]);
}
}
acm算法之dfs经典n皇后问题
最新推荐文章于 2022-05-06 00:48:01 发布