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

(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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值