N-Queens

class Solution {
    private Set<Integer> vertical;
    private Set<Integer> cross1;
    private Set<Integer> cross2;
    List<List<String>> result;
    
    public List<List<String>> solveNQueens(int n) {
        result = new ArrayList<>();
        vertical = new HashSet<>();
        cross1 = new HashSet<>();
        cross2 = new HashSet<>();
        
        helper(n, 0, new ArrayList<>());
        
        return result;
    }
    
    private void helper(int n, int row, List<Integer> path) {
        if (row == n) {
            result.add(convert(path));
            return;
        }
        
        for (int col = 0; col < n; col++) {
            int cross1Val = row + col;
            int cross2Val = row - col;
            if (notValid(col, cross1Val, cross2Val)) {
                continue;
            }
            vertical.add(col);
            cross1.add(cross1Val);
            cross2.add(cross2Val);
            path.add(col);
            
            helper(n, row + 1, path);
            
            vertical.remove(col);
            cross1.remove(cross1Val);
            cross2.remove(cross2Val);
            path.remove(path.size() - 1);
        }
    }
    
    private boolean notValid(int col, int cross1Val, int cross2Val) {
        return vertical.contains(col) || cross1.contains(cross1Val) || cross2.contains(cross2Val);
    }
    
    private List<String> convert(List<Integer> path) {
        char[] board = new char[path.size()];
        Arrays.fill(board, '.');

        return path.stream()
            .map(val -> {
                board[val] = 'Q';
                String newBoard = new String(board);
                board[val] = '.';
                return newBoard;
            })
            .collect(Collectors.toList());
    }
}

最后更新于

这有帮助吗?