LeetCode //C - 52. N-Queens II

52. N-Queens II

The n-queens puzzle is the problem of placing n queens on an n x n chessboard such that no two queens attack each other.

Given an integer n , return the number of distinct solutions to the n-queens puzzle.

Example 1:

Input: n = 4
Output: 2
Explanation: There are two distinct solutions to the 4-queens puzzle as shown.

Example 2:

Input: n = 1
Output: 1

Constraints:
  • 1 <= n <= 9

From: LeetCode

Link: 52. N-Queens II


Solution:

Ideas:
  1. Start in the leftmost column.
  2. If all queens are placed, return true.
  3. Try all rows in the current column.
  • If the queen can be placed safely in this row, mark this cell and place the queen.
  • Recur to place the rest of the queens.
  • If placing the queen in the current row and proceeding to place the next queen leads to a solution, return true.
  • If placing the queen doesn't lead to a solution, then unmark this cell, backtrack, and go to the next row in the current column.
  1. If all rows have been tried and none worked, return false to trigger backtracking.

To determine if a queen can be placed safely, we need to check three things:

  1. There's no queen in the same row.
  2. There's no queen in the same diagonal (both left upper diagonal and right upper diagonal).
Code:
c 复制代码
bool isSafe(int board[], int row, int col, int n) {
    for (int i = 0; i < col; i++) {
        if (board[i] == row || 
            board[i] - i == row - col || 
            board[i] + i == row + col) {
            return false;
        }
    }
    return true;
}

int solveNQueensUtil(int n, int col, int board[]) {
    if (col >= n) {
        return 1;
    }
    int count = 0;
    for (int i = 0; i < n; i++) {
        if (isSafe(board, i, col, n)) {
            board[col] = i;
            count += solveNQueensUtil(n, col + 1, board);
        }
    }
    return count;
}

int totalNQueens(int n) {
    int board[n];
    for (int i = 0; i < n; i++) {
        board[i] = 0;
    }
    return solveNQueensUtil(n, 0, board);
}
相关推荐
郭源潮122 分钟前
【C++二叉树】二叉树的前序遍历、中序遍历、后序遍历递归与非递归实现
开发语言·c++·算法
请揣满RMB23 分钟前
BFS 解决多源最短路问题
算法·宽度优先
咩咩大主教34 分钟前
LinuxC++的UDP服务器和客户端通信
linux·服务器·c语言·开发语言·c++·udp
Mephisto.java34 分钟前
【数据结构与算法 | 灵神题单 | 二叉搜索树篇】力扣653
算法·leetcode·职场和发展
zyx没烦恼35 分钟前
C\C++内存管理详解
c语言·c++
Qhumaing36 分钟前
C语言PTA-计算最大游戏胜率
c语言·开发语言·学习·pta
sjsjs1138 分钟前
【贪心】【数据结构-小根堆,差分】力扣2406. 将区间分为最少组数
数据结构·算法·leetcode
远望樱花兔1 小时前
【d46】【Java】【力扣】876.链表的中间结点
java·leetcode
码上一元1 小时前
【百日算法计划】:每日一题,见证成长(019)
java·数据结构·算法
hn小菜鸡2 小时前
LeetCode 面试经典150题 67.二进制求和
算法·leetcode·面试