LeetCode: N-Queens

来源:互联网 发布:她和他马克李维 知乎 编辑:程序博客网 时间:2024/06/02 02:59

题目链接:https://leetcode.com/problems/n-queens/#/description

这是十分经典的八皇后问题的变形,以八皇后问题为例,在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。方法: 回溯法。

代码:

class Solution {      int *x;public:    vector<vector<string> > solveNQueens(int n) {        vector<vector<int> > result_int;        vector<vector<string> > result;        vector<int> temp;        x = new int[n+1];        for(int i =0; i<n; i++) x[i] = 0;        n_queen(n, 1, result_int);      //  for(int i =0; i<n; i++) cout<<x[i];        for(vector<vector<int> >::iterator begin_2 = result_int.begin(); begin_2 != result_int.end(); begin_2++){                  temp = *(begin_2);            for(vector<int>::iterator begin_1 = temp.begin(); begin_1 != temp.end(); begin_1++){             //  cout<<*begin_1<<endl;            }        }        convert(result_int, result,n);         return result;      }    void convert(vector<vector<int> > &vec_int, vector<vector<string> > &vec_str,int n){        vector<int> temp;         vector<string> temp_str;        string str(n,'.');       // cout<<str;        string strr;        for(vector<vector<int> >::iterator begin_2 = vec_int.begin(); begin_2 != vec_int.end(); begin_2++){             temp = *(begin_2);            for(vector<int>::iterator begin_1 = temp.begin(); begin_1 != temp.end(); begin_1++){                str.assign(n, '.');                str[*begin_1-1] = 'Q';                temp_str.push_back(str);               // if((begin_1+1) == temp.end())  {strr+= str;  str.assign(vec_int.size(), '.');  }              // else {strr+= (str+'.');  str.assign(vec_int.size(), '.');  };            }            vec_str.push_back(temp_str);            temp_str.clear();        }        return ;    }    void n_queen(int n, int k, vector<vector<int> > &result){        if(k > n){            vector<int> vec;            for(int i=1; i<=n; i++){             //   cout<<x[i];                vec.push_back(x[i]);              }           // cout<<endl;            result.push_back(vec);        }        else {            for(int i=1; i<=n; i++){                x[k] = i;                if(legal(k)) n_queen(n,k+1, result);            }        }    }    bool legal(int k){        for(int i=1; i<k; i++){            if((abs(x[i]-x[k]) == abs(i - k)) || x[i] == x[k] ) return false;        }          return true;    }};
原创粉丝点击