八皇后问题,即在$8 \times 8$的棋盘上放置8个皇后,使得它们互不攻击(皇后的攻击范围为同行同列和同对角线)。
参考
刘汝佳《算法竞赛入门经典》(第2版)
解法
比较容易想到的一个思路是把这个问题转换为“从64个格子中选8个格子”的问题。但是这一共有$C^8_{64} = 4.426 \times 10^9$种情况。我们可以考虑先排除一些明显不成立的情况,减少枚举量。首先八个皇后肯定是位于不同行不同列的,所以逐行放置可以把这个问题看做一个求$0-7$列的全排列问题。这样的话总的情况数为$8! = 40302$种,同时用回溯法进行剪枝操作,可以在1秒内完成检索。
$(i,C[i])$和$(j,C[j])$分别表示两个皇后坐标,它们位于同一对角线上的条件:i - C[i] == j - C[j] || i + C[i] == j + C[j]
代码
1 |
|