LeetCode 51 N 皇后 - 回溯解法

LeetCode 51 N 皇后 - 回溯解法

https://leetcode.cn/problems/n-queens/description/

思路

for(0- n-1){
	if(i 位置合法,可以放皇后){
		path push
		add_path()
		path pop
	}
}
终止条件

if( path.size()==n)

判断合法

要求:同一行 同一列只能有一个皇后, 斜线也只能有一个。

分析:显然本行的皇后的位置受制于 path中已经加入的即:前面已经放置的皇后。

当前位置的受影响的位置为:loc[i]-(path.size()-i)loc[i]+(path.size()-i)


合法为1,不合法为-1
vector<int> get_valid_loc(int n){
	vector<int> res;
	for(inti <size()){
		//同一列
		res[loc[i]] = -1;
		int left = loc[i]-(path.size()-i)
		int right = loc[i]+(path.size()-i)
		if(left>=0)  res[left] =-1;
		if(right<n)  res[right]  =-1;

	}
	return res;
}

代码

class Solution {

public:

    struct Path_node{

        vector<string> path;

        vector<int> q_loc;

    };

    Path_node path_node;

    vector<vector<string>> result;

    vector<int> get_val_loc(int n){

        vector<int> res(n,1);

        for(int i = 0;i<path_node.path.size();i++){

            res[path_node.q_loc[i]] = -1;

            int left = path_node.q_loc[i]-(path_node.path.size()-i);

            int right = path_node.q_loc[i]+(path_node.path.size()-i);

            if(left>=0){

                res[left] = -1;

            }

            if(right<n){

                res[right] = -1;

            }

        }

        return res;

    }

    void add_path(int n){

        if(path_node.path.size()==n){

            result.push_back(path_node.path);

            return;

        }

        vector<int> valid_loc = get_val_loc(n);

        for(int i = 0;i<n;i++){

            if(valid_loc[i]==1){

                string tmp(n,'.');

                tmp[i] = 'Q';

                path_node.path.push_back(tmp);

                path_node.q_loc.push_back(i);

                add_path(n);

                path_node.path.pop_back();

                path_node.q_loc.pop_back();

            }

        }

    }

    vector<vector<string>> solveNQueens(int n) {

        add_path(n);

        return result;

    }

};