n皇后是指将n个皇后放在n-n的国际象棋棋盘上,使皇后不能相互攻击到,即任意两个皇后不能再同一行、同一列或同一斜线上。
算法基本思路:
1.当N个皇后摆放好,依次输出
2.对每行U的0-N列遍历,比较第U个皇后是否会发生冲突(横、竖、对角线)
3.放置好后对该皇后、横、竖、斜对角线做标记,下一次放置 则不会出现在以上地方
需要变量:
q[n][n] 棋盘,不放置为‘.’,放置则为‘Q’
col[n] bool的列标记,标记为True则该列不能再放皇后
dg[n+u-i]、udg[u+i] 对角线、反对角线bool标记
n+u-i、u+i 数学推理过程:
1.对角线函数表示 y=x+b 则截距表达为b = y-x,为防止存在负数 则表示为 n+y-x 即 n+u-i
2. 反对角线函数表示为y=-x+b 则截距表达为 b = y+x 即u+i
def dfs(u): if u==n: print(q) return for i in range(0,n): if !col[i] and !dg[n+u-i] and !udg[u+i]: q[u][i] = 'Q' col[i] = dg[n+u-i] = udg[u+i] = True dfs(u+1) # 回溯 q[u][i] = '.' col[i] = dg[n+u-i] = udg[u+i] = False