八皇后问题

使用dfs Right数组记录了那一条从左下到右上的对角线上不能放棋子,
Right【i+ x】
例如:
i + x = 2, (i,x) = (0,2) , (1,1),(2,0) 这一条线上都不能放棋子
i + x = 5 (i,x) = (0,5),(1,4),(2,3),(3,2),(4,1),(5,0)之一条线上不能放棋子
Left【i- x + n】记录了那一条从左上到右下的对角线上不能放棋子。
推导:
同一对角线(0,0)(1,1)(2,2)
(1,2)(2,3)(3,4)
有公式y = x + b
有公式 y- x = b,因为b可能为负,y-b + n最为公式
Left[i - x + n]
const int MAXN = 1010;
bool Left[2*MAXN];
bool Right[2*MAXN];
int vis[MAXN];
int a[MAXN];//a中记录了每一列选择的行数
int ans;
void permutation(int x,int n)
{
if(x==n)
{
ans++;
for(int i = 0;i < n ;i++)
printf("%d ",a[i]);
printf("\n");
return;
}
for(int i = 0;i < n;i++)
{
if(!vis[i] && !Left[i - x + n] && ! Right[i + x]){
vis[i] = 1;
Left[i - x +n] = 1;
Right[i + x] = 1;
a[x] =i;
permutation(x+1,n);
vis[i] = 0;
Left[i - x +n] = 0;
Right[i + x] = 0;
}
}
}
选数问题

给定n个正整数,要求选K个数,使得选出来K个数之和为sum,求和法的方案数
K < n < 16

int s;
int k;
int cnt++;
int a[20];
void dfs(int sum,int x,int kk)
{
if(sum == s && kk = k)
{
cnt++;
return;
}
if(x > n || sum > s || kk > k) return;
//选这个数
dfs(sum + a[x],x + 1, kk+1);
//不选这个数
dfs(sum, x+1, kk );
}
再卖菜CSP201909-4

使用dfs搜索
本文探讨了八皇后问题的解决方案,利用深度优先搜索(DFS)策略,通过左右对角线限制避免冲突。同时介绍了如何在给定数列中选择特定数量的元素以达到预设和的组合优化问题,同样采用DFS进行求解。这两个问题展示了DFS在解决约束条件下搜索问题的广泛应用。
289

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



