842. 排列数字
u: 此时前0-(u-1)位数已确定
i: 1-n的数值
st[i]:哪个数值被占用
path[u]:此时[0,u]位已经放置好的结果
843. n-皇后问题
方法1: 同排列数字暴搜,同时注意剪枝。
dfs(u){// 假如皇后放在第u行
if(u == n){// u是从0开始计数的,所以要是u == n则说明,所有行全遍历结束
输出结果
}
for(int i = 0; i<n;i++){// 遍历所有列
if(!col[i] && !dg[i -u +n] && !ndg[i +u])
// 如果第i列,和当前结点[u][i]的正/反对角线都没被占,则
记录状态 col=dg=ndg=true,g[u][i] = 'Q' 遍历皇后放在下一行循环;
结果回溯:col=dg=ndg=false,g[u][i] = '.' 如果不回溯,会影响到下一种方案
}
}
方法2:枚举所有位置,判断当前位置放不放皇后
dfs(int x, int y, int s){
一些判断条件:
1.如果当前行遍历结束转到下一行
if(y == n) y = 0, x++;
2.如果遍历完最后一行,且皇后的个数=n,则输出
if(x == n){
if(s == n) puts();
}
如果当前位置不放皇后,则考虑下一个位置
dfs(x,y+1,s);
如果当前的位置放皇后,在行 列 正/反对角 都未被标记的情况下
1.标记:行 列 正/反对角=true, g[x][y] = 'Q'
2.遍历下个位置:dfs(x,y,s+1)
3.回溯: 行 列 正/反对角=false, g[x][y] = '.'
}