leetcode之路051 N-Queens

来源:互联网 发布:ubuntu 14.04u盘镜像 编辑:程序博客网 时间:2024/06/05 17:15


题目大意:n皇后问题,使得每一个皇后与其它皇后不在同一行、同一列和同一斜线上。


思路:

深度优先遍历所有情况,遇到不满足时则回溯,可以有非递归实现和递归实现。


ac的代码如下:

class Solution {public:    vector<vector<string>> solveNQueens(int n) {        vector<vector<string>> resu;vector<int> tmp;for(int k=0;k<n;++k)tmp.push_back(-1);int i=0;while(i>-1){for(++tmp[i];tmp[i]<n;++tmp[i]){if(check(tmp,i))break;}if(tmp[i]<n){if(i==n-1){vector<string> retm;for(int k=0;k<n;++k){string ss="";for(int l=0;l<n;++l)ss+='.';ss[tmp[k]]='Q';retm.push_back(ss);}resu.push_back(retm);}else{++i;tmp[i]=-1;}}else--i;}return resu;    }int check(vector<int> aa,int n){for(int i=0;i<n;++i)if(abs(aa[n]-aa[i])==n-i||aa[n]==aa[i])return 0;return 1;}};


递归实现:

class Solution {public:vector<int> tmp;    vector<vector<string>> solveNQueens(int n) {        vector<vector<string>> resu;for(int k=0;k<n;++k)tmp.push_back(-1);test(resu,0,n);return resu;    }void test(vector<vector<string>> &resu,int i,int n){int  j;for(j=0;j<n;++j){tmp[i]=j;if(check(tmp,i)){if(i<n-1)test(resu,i+1,n);else{vector<string> retm;for(int k=0;k<n;++k){string ss="";for(int l=0;l<n;++l)ss+='.';ss[tmp[k]]='Q';retm.push_back(ss);}resu.push_back(retm);}}}}int check(vector<int> aa,int n){for(int i=0;i<n;++i)if(abs(aa[n]-aa[i])==n-i||aa[n]==aa[i])return 0;return 1;}};



0 0