/* * 51. N-Queens * 2016.3.12 by Mingyang * 在这道题目里面,到了最后一步,才把整个棋盘转换成List of String * 其余的大部分时间都是只是把棋盘相应的位置填满 另外这道题目走的方式,不是像word * search那么上下左右到处走,而是在列数确定的情况下,行数从第一个到最后一个loop * 1.长度标准:无 * 2.可选的范围:在col固定的情况下,遍历所有的row * 3.往前走一步:如果某一个row可以就检查是否validate,并且把棋盘上的值改了 * 4.后退一步:棋盘上的值改回来 * 5.特别的case:column走到了最后一个 * 6.关于重复:无 * 这道题目其实并不难,最巧的地方是最开始的时候board全部赋值为.然后后面再改board * 这里就是把board 转变成了一个res */ public List<List<String>> solveNQueens(int n) { char[][] board = new char[n][n]; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) board[i][j] = '.'; List<List<String>> res = new ArrayList<List<String>>(); dfs(board, 0, res); return res; } private void dfs(char[][] board, int colIndex, List<List<String>> res) { if (colIndex == board.length) { res.add(construct(board)); return; } for (int i = 0; i < board.length; i++) { if (validate(board, i, colIndex)) { board[i][colIndex] = 'Q'; dfs(board, colIndex + 1, res); board[i][colIndex] = '.'; } } } private boolean validate(char[][] board, int x, int y) { for (int i = 0; i < board.length; i++) { for (int j = 0; j < y; j++) { if (board[i][j] == 'Q'&& (x + j == y + i || x + y == i + j || x == i)) //注意不要忽略这里有两个对角线,一个是x + j == y + i,另外一个是x + y == i + j //另外一个问题就是因为j是这个点的左半边,所以右半边不用管,因为是从左往右加起走的 return false; } } return true; } private List<String> construct(char[][] board) { List<String> res = new LinkedList<String>(); for (int i = 0; i < board.length; i++) { String s = new String(board[i]); res.add(s); } return res; }