ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [LeetCode] 51. N-Queens
    Life/PS 2026. 5. 29. 14:09

    Well-known back tracking problem.

    class Solution {
    public:
        vector<vector<bool>> board;
        vector<vector<string>> res;
    
        bool safe(int row, int col, const int n) {
            // Skip row-wise check and cells lower than current row.
            for(int r = 0; r < row; r++) { if(board[r][col]){ return false; } }
            for(int r = row-1, c = col-1; r >= 0 && c >= 0; r--, c--) {
                if(board[r][c]){ return false; }
            }
            for(int r = row-1, c = col+1; r >= 0 && c < n; r--, c++) {
                if(board[r][c]){ return false; }
            }
            return true;
        }
    
        int rcsv(int cur_row, const int n) {
            if (cur_row == n) {
                vector<string> ans(n, "");
                for(int i = 0; i < n; i++) { 
                    for(bool cell: board[i]) { ans[i] += cell ? 'Q' : '.'; } }
                res.push_back(ans);
                return 1;
            }
    
            int ret = 0;
    
            for(int col = 0; col < n; col++) {
                if (!safe(cur_row, col, n)) { continue; }
                board[cur_row][col] = true;
                ret += rcsv(cur_row+1, n);
                board[cur_row][col] = false;
            }
    
            return ret;
        }
    
        vector<vector<string>> solveNQueens(int n) {
            board.assign(n, vector<bool>(n, false));
            res.clear();
            rcsv(0, n);
            return res;
        }
    };

     

    Without recursion:

    class Solution {
    public:
        vector<vector<string>> solveNQueens(int n) {
            vector<vector<string>> res;
            vector<string> board(n, string(n, '.'));
    
            vector<bool> col(n, false);
            vector<bool> diag1(2 * n - 1, false);
            vector<bool> diag2(2 * n - 1, false);
    
            vector<int> queen(n, -1);
    
            int row = 0;
            int c = 0;
    
            for(;;) {
                bool placed = false;
    
                for(; c < n; c++) {
                    int d1 = row + c;
                    int d2 = row - c + n - 1;
    
                    if(col[c] || diag1[d1] || diag2[d2]) { continue; }
    
                    board[row][c] = 'Q';
                    queen[row] = c;
                    col[c] = diag1[d1] = diag2[d2] = true;
    
                    placed = true;
                    break;
                }
    
                if(placed) {
                    if(row == n-1) { res.push_back(board); }
                    else { row++; c = 0; continue; }
                }
                else {
                    if(--row < 0) { break; }
                }
    
                int old = queen[row];
                board[row][old] = '.';
                col[old] = diag1[row + old] = diag2[row - old + n - 1] = false;
                queen[row] = -1;
    
                c = old + 1;
            }
    
            return res;
        }
    };

    'Life > PS' 카테고리의 다른 글

    [LeetCode] 60. Permutation Sequence  (0) 2026.05.30
    [LeetCode] 52. N-Queens II  (0) 2026.05.29
    [LeetCode] 42. Trapping Rain Water  (0) 2026.05.27
    [LeetCode] 41. First Missing Positive  (0) 2026.05.24
    [LeetCode] 32. Longest Valid Parentheses  (0) 2026.05.23
Designed by Tistory.