#yyds干货盘点# leetcode算法题:N 皇后

网友投稿 741 2022-11-01

#yyds干货盘点# leetcode算法题:N 皇后

#yyds干货盘点# leetcode算法题:N 皇后

题目:

按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。

每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 'Q' 和 '.' 分别代表了皇后和空位。

示例 1:

输入:n = 4

输出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]

解释:如上图所示,4 皇后问题存在两个不同的解法。

示例 2:

输入:n = 1

输出:[["Q"]]

代码实现:

class Solution { public List> solveNQueens(int n) { List> solutions = new ArrayList>(); int[] queens = new int[n]; Arrays.fill(queens, -1); Set columns = new HashSet(); Set diagonals1 = new HashSet(); Set diagonals2 = new HashSet(); backtrack(solutions, queens, n, 0, columns, diagonals1, diagonals2); return solutions; } public void backtrack(List> solutions, int[] queens, int n, int row, Set columns, Set diagonals1, Set diagonals2) { if (row == n) { List board = generateBoard(queens, n); solutions.add(board); } else { for (int i = 0; i < n; i++) { if (columns.contains(i)) { continue; } int diagonal1 = row - i; if (diagonals1.contains(diagonal1)) { continue; } int diagonal2 = row + i; if (diagonals2.contains(diagonal2)) { continue; } queens[row] = i; columns.add(i); diagonals1.add(diagonal1); diagonals2.add(diagonal2); backtrack(solutions, queens, n, row + 1, columns, diagonals1, diagonals2); queens[row] = -1; columns.remove(i); diagonals1.remove(diagonal1); diagonals2.remove(diagonal2); } } } public List generateBoard(int[] queens, int n) { List board = new ArrayList(); for (int i = 0; i < n; i++) { char[] row = new char[n]; Arrays.fill(row, '.'); row[queens[i]] = 'Q'; board.add(new String(row)); } return board; }}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Scatteract是一个自动从散点图中提取数据的框架
下一篇:CardParts - 构建在UIKit之上响应式,基于卡片的UI框架
相关文章

 发表评论

暂时没有评论,来抢沙发吧~