问题描述:
在n×n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n×n格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。
算法思路:
一、使用回溯法,即先穷举后优化的思想。ps:data[0] = 2表示第1列的第二个
- 先穷举出所有的可能性
- 检查是否符合不在同一行或同一斜线上
- 再优化:
不满足的就不执行了
if (index > 1) {
if (!check_data(data, index - 1)) return;
}
注意,这里只需检查是否在同一行或同一斜线上即可,因为本身就是一个赋一个位置的值 然后赋下一列的,同一列的不会赋两次值,就不用判断。
if (data[index] == data[i])
//判断是否在一行
return false;
if ((index + data[index]) == (i + data[i]))
if (data[index] == data[i])
//判断是否在一行
return false;
if ((index + data[index]) == (i + data[i]))
//判断斜向上的对角线 (行号+列号) 和相等
return false;
if ((index - data[index]) == (i - data[i]))
//判断斜向下的对角线(行号-列号)差相等
return false;
}