N-Queens && II and Permutations && II && Next Permutation

来源:互联网 发布:中南民族大学网络使用 编辑:程序博客网 时间:2024/06/08 16:26

(1) N-Queens

典型的N皇后问题[1]:

class Solution {private:    void print(int *q, vector<vector<string>> &ret,int n) {        vector<string> tmp;                for(int i=1;i<=n;i++)        {            string s(n,'.');            s[q[i]-1]='Q';            tmp.push_back(s);        }                ret.push_back(tmp);    }    bool place(int k,int *q) {        for(int i=1;i<k;i++)            if(abs(k-i)==abs(q[k]-q[i]) || q[k]==q[i])                return false;        return true;    }    int queen(int t,int *q,int n,int &sum,vector<vector<string>> &ret) {        if(t>n && n>0)            print(q,ret,n);        else            for(int i=1;i<=n;i++)            {                q[t]=i;                if(place(t,q))                    queen(t+1,q,n,sum,ret);            }        return sum;    }public:    vector<vector<string> > solveNQueens(int n) {        int sum=0;        int q[n+1];        vector<vector<string>> ret;        queen(1,q,n,sum,ret);        return ret;    }};


(2) N-Queens II
class Solution {private:    bool place(int k,int *q) {        for(int i=1;i<k;i++)            if(abs(k-i)==abs(q[k]-q[i]) || q[k]==q[i])                return false;        return true;    }    int queen(int t,int *q,int n,int &sum) {        if(t>n && n>0)            sum++;        else            for(int i=1;i<=n;i++)            {                q[t]=i;                if(place(t,q))                    queen(t+1,q,n,sum);            }        return sum;    }    public:    int totalNQueens(int n) {        int sum=0;        int q[n+1];        queen(1,q,n,sum);        return sum;    }};

(3) Permutations

两种方法:一、建立一个是否使用表[2];二、单纯交换位置[3]。

class Solution {private:    void solve(int dep,vector<int> num,vector<int> &tmp,vector<vector<int>> &ret,int *sign) {        int maxDep=num.size();                if(dep==maxDep)            {                ret.push_back(tmp);                return;            }                    for(int i=0;i<maxDep;i++)            if(sign[i]==0)            {                sign[i]=1;                tmp[dep]=num[i];                solve(dep+1,num,tmp,ret,sign);                sign[i]=0;            }    }public:    vector<vector<int> > permute(vector<int> &num) {        vector<vector<int>> ret;        vector<int> tmp(num.size());        int sign[num.size()];        memset(sign,0,sizeof(sign));        solve(0,num,tmp,ret,sign);        return ret;    }};

(4) Permutations II 

交换方法[4]会显示Output Limit Exceeded错误,不知何解,还是得用是否使用表方法[5](事先得排序):

class Solution {private:    void solve(int dep,vector<int> num,vector<int> &tmp,vector<vector<int>> &ret,int *sign) {        int maxDep=num.size();                if(dep==maxDep)            {                ret.push_back(tmp);                return;            }                    for(int i=0;i<maxDep;i++)            if(sign[i]==0)            {                if (i > 0 && num[i] == num[i-1] && sign[i-1]==0)                    continue;                sign[i]=1;                tmp[dep]=num[i];                solve(dep+1,num,tmp,ret,sign);                sign[i]=0;            }    }public:    vector<vector<int> > permuteUnique(vector<int> &num) {        vector<vector<int>> ret;        vector<int> tmp(num.size());        int sign[num.size()];        memset(sign,0,sizeof(sign));                sort(num.begin(), num.end());//key                solve(0,num,tmp,ret,sign);        return ret;    }};

(5) Next Permutation

原理见[6]:

class Solution {public:    void nextPermutation(vector<int> &num) {        // Start typing your C/C++ solution below        // DO NOT write int main() function        int nSize = num.size();        if (nSize <= 1) return;                int idx = nSize - 1;        // 查找第一个下降的元素        while(--idx >= 0 && num[idx] >= num[idx+1]);        if (idx >= 0)        {            int i = nSize - 1;            // 查找第一个比idx所指元素大的元素            while(num[i] <= num[idx])            {                --i;            }            swap(num[i], num[idx]);            // 反转后面所有元素,让它从小到大sorted            reverse(num.begin()+idx+1, num.end());        }        else        {            reverse(num.begin(), num.end());        }    }};


参考:

[1] http://blog.sina.com.cn/s/blog_696187fd0100p5ri.html

[2] http://www.2cto.com/kf/201310/251020.html

[3] http://www.cnblogs.com/panda_lin/archive/2013/11/12/permutations.html

[4] http://blog.csdn.net/xx77009833/article/details/17843415

[5] http://www.cnblogs.com/remlostime/archive/2012/11/13/2768816.html

[6] http://blog.csdn.net/pickless/article/details/9188769

0 0
原创粉丝点击