N皇后是一个很经典的题目,我这里使用的是递归的形式来暴力检索所有的情况。
首先我定义了一个board的二维数组做棋盘,并初始化棋盘。根据题目要求,任何两个皇后都不能处于同一条横行、纵行或斜线上,所以我新增了一个判断在i,j点放置皇后是否有效的方法isValid,这个方法是核心,比较难的点在于如何判断左斜线和右斜线的情况。
因为任何两个皇后都不能处于同一条横行上,且有n个皇后,棋盘大小为n*n,那么显而易见就是每一行都必须有一个皇后,所以我通过行来递归,即solve方法只遍历一行的n种放置情况,找到有效的放置点之后,再继续递归下一行。这里有个需要注意的点是,在递归调用之后,需要将本次放置的皇后的点恢复,即拿掉皇后。因为本行还有其他种放置皇后的情况待检索。
递归结束的判断条件是i==n,即皇后已经都放置完了,这个时候因为题目要求,所以我们需要将已经查找到的有效的方案转换成题目需要的数据形式,见convert方法。