之在同一行、同一列、同一斜线上的棋子。设计算法在 n×n 的棋盘上放置 n 个皇后,使其彼此不受攻击。
输入:
4
输出:
2 4 1 3
3 1 4 2
可行方案数:2
问题分析:
题目要求不同行不同列不同斜线上,因为约束条件太多和考虑复杂度,我们不可能直接每个都枚举,可以先以行为主导,每行只放一个,找到可行的位置后就进行下一行的搜索,当某个位置放第t个皇后时,需要判断与前面已经放好的t-1个皇后的列和对角线时候相同,都不相同就可以在该位置放t皇后,判断是否在同一对角线可以用两位置行的差的绝对值和列的差的绝对值是否相等,可以以深度优先搜索的方式进行搜索,在t行的第i列判断时候可以放,可以放就向深一行进行搜索,不可以放就继续判断i+1,因为是n行n列的棋盘有n个皇后,说明每一行每一列都已经有一个且只有一个皇后,如果在第t行全部搜素都没有可行的位置说明下面几行继续放也没意义,这时就需要回溯,返回上一行继续搜索,直到n个皇后放完,当一种方案确定后也需要回溯继续搜索时候还有另外放方案。
代码:
#include<iostream>
#include<math.h>
using namespace std;
#define M 105
int n;//皇后
int x[M];//第M个皇后放在M行X[M]列
int num;//可行方案的个数
bool place(int t)
{//判断第