n皇后-回溯法全解

n皇后

恶心的n皇后,回溯法

没啥好说的

#include <iostream>
#include <vector>
#include <string>

using namespace std;


class Solution {
public:

	//放入(x,y)之后标记不能放的位置
    void putQueen(int x, int y, vector<vector<int >>& attack){
        //8个方向的数组
        static const int dx[] = {-1, 1, 0, 0, -1, -1, 1, 1};
        static const int dy[] = {0, 0, -1, 1, -1, 1, -1, 1};

        attack[x][y] = 1;

        //标记皇后会攻击的位置
        for(int i=1; i<attack.size(); i++){
            for(int j=0; j<8; j++){
                int nx = x+i*dx[j];
                int ny = y+i*dy[j];

                if(nx>=0 && ny>=0 && nx<attack.size() && ny<attack.size()){
                    attack[nx][ny] = 1;
                }
            }
        }
    }

    //回溯法解决n皇后
    //k当前处理行,n皇后,queue存储皇后位置,attack标记攻击位置,solve全部解法
    void backtrack(int k, int n, vector<string> &queue, 
                   vector<vector<int>> &attack,vector<vector<string>> &solve){
        
        if(k == n){
            solve.push_back(queue);
            return ;
        }
        for(int i=0; i<n; i++){
            if(attack[k][i] == 0){
                vector<vector<int> > tmp = attack; //备份attack数组 用于回溯
                queue[k][i] = 'Q';
                putQueen(k, i, attack);
                backtrack(k+1, n, queue, attack, solve);
                attack = tmp;
                queue[k][i] = '.';
            }
        }
    }

    //初始化
    vector<vector<string>> solveNQueens(int n) {
        vector<vector<string> > solve;
        vector<vector<int> > attack;
        vector<string> queue;
	
        //初始化attack, queue
        for(int i=0; i<n; i++){
        	attack.push_back(vector<int>());
            for(int j=0; j<n; j++){
                attack[i].push_back(0);
            }
            queue.push_back("");
            queue[i].append(n, '.');
        }

        backtrack(0, n, queue, attack, solve);

        return solve;
    }

};


int main(){
	
	Solution s;
	
	vector<vector<string>> res;
	res = s.solveNQueens(8); //8皇后
	
	for(int i=0; i<res.size(); i++){
		cout<<"解法"<<i+1<<": \n";
		for(int j=0; j<res[i].size(); j++){
			cout<<res[i][j]<<endl;
		} 
		cout<<endl;
	}
	
	
	return 0;
} 



猜你喜欢

转载自blog.csdn.net/qq_44861043/article/details/119917941