题意:在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于再n×n的棋盘上放置n个皇后,任何2个皇后不妨在同一行或同一列或同一斜线上。
就是考虑皇后放置的位置,对于每一行,我们需要枚举每个可以放置皇后的位置,而且需要判断当前位置(第i行)是否满足条件,即判断这个位置是否与放置好的前i-1行的皇后的位置相冲突,如果冲突,说明这个位置不合适;否则的话,就可以枚举下一行皇后的位置,直至第n行。
#include<stdio.h>
#include<string.h>
#define MAX 15
int a[MAX];
int s[MAX];
int vis[MAX];
int n,t,tot;
void dfs(int cur)
{
int i,j;
if(cur==n)
{
tot++;
}
else
{
for(i=0;i<n;i++)
{
int ok=1;
a[cur]=i;
for(j=0;j<cur;j++)
{
if(a[cur]==a[j]||cur-a[cur]==j-a[j]||cur+a[cur]==j+a[j])
{
ok=0;
break;
}
}
if(ok)
dfs(cur+1);
}
}
}
int main()
{
int m,j,i,k;
memset(a,0,sizeof(a));
memset(s,0,sizeof(s));
for(n=1;n<=10;n++)
{
tot=0;
dfs(0);
s[n]=tot;
}
while(scanf("%d",&t),t)
{
printf("%d\n",s[t]);
}
return 0;
}
本文介绍了一种通过深度优先搜索解决N皇后问题的方法,并提供了一个完整的C语言实现示例。该算法通过递归地检查每一步放置皇后的位置是否会导致冲突来寻找所有可行解。
1523

被折叠的 条评论
为什么被折叠?



