题目描述:
在一个n×n的棋盘上放置n个王后,使得每个王后不会相互攻击,即任意两个王后不在同一行、同一列、同一对角线上,输出所有的放置方式。
输入n,表示棋盘大小。
思路:
深度优先搜索(DFS):枚举第i个王后的放法,再枚举第i+1个王后的放置方法,直至放置完所有棋子,检查放置方式是否合法,若合法则输出;不合法则返回,尝试其他放置方式。
公用:
bool isValid(int n) //全部棋子放完之后判断是否合法的函数,主要判断任意两颗棋子是否在同一对角线上
isvalid函数判断是否在同一对角线上的依据是两个点(x1,y1),(x2,y2)是否存在x1+y1=x2+y2或x1-y1=x2-y2的情况。函数采用了两组数组记录棋子坐标的x和y,同一下标表示同一个点的x值或y值。
isvalid函数首先通过二重循环将n个放置好的棋子的坐标单独取出并记录,再通过二重循环将两个相邻的点进行比较,最后全部比较一遍,判断是否有两个点在同一对角线上,注意j=i+1的这种循环起始模式是判断相邻的。
注意:isvalid函数传参的时候也要注意传的是sum值,因为isvalid函数是判断n个棋子是否都放置合法了,所以要用sum,不然n会变。
for(int p=1;p<=n;++p)