【LeetCode052】N皇后問題,回溯法
阿新 • • 發佈:2019-02-10
題目連結:
https://leetcode.com/problems/n-queens-ii/
題目描述:
輸入N,輸出N皇后滿足的可能結果,即N個皇后不在同一行,同一列,同一對角線。
題目分析:
直接回溯法即可,只需確定Qi佔了哪一行 ,那一列,哪條對角線(正負對角線)。
標記是否被佔用:Qi在ri行,ci列時
行: 按行ri + 1遞迴進去,故行號不可能重複
列: col[ci] = 1;
正對角線: x1[ri + ci] = 1;
反對角線: x2[ri + n - 1 - ci] = 1;
AC程式碼:
#include<stdio.h> #include<string> using namespace std; int col[101]; int x1[202]; int x2[202]; int ans = 0; class Solution { public: int totalNQueens(int n) { ans = 0; memset(col, 0, sizeof(col)); memset(x1, 0, sizeof(x1)); memset(x2, 0, sizeof(x2)); solve(0, n); // printf("%d\n", ans); return ans; } void solve(int ri, int n) { if (ri == n) { ans++; return; } int ci; for (ci = 0; ci < n; ci++) { if (col[ci] || x1[ri + ci] || x2[ri + n - 1 - ci]) continue; col[ci] = 1; x1[ri + ci] = 1; x2[ri + n - 1 - ci] = 1; solve(ri + 1, n); col[ci] = 0; x1[ri + ci] = 0; x2[ri + n - 1 - ci] = 0; } } }; int main() { Solution s; s.totalNQueens(13); return 0; }