1. 程式人生 > >【LeetCode052】N皇后問題,回溯法

【LeetCode052】N皇后問題,回溯法

題目連結:

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;
}