回溯算法求关于排列有关问题
Posted sddr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了回溯算法求关于排列有关问题相关的知识,希望对你有一定的参考价值。
八皇后问题就是一个典型的全排列问题了,这个在有一篇博客已经写过了,但是今天想在这里对于排列问题来一个总结。
排列问题主要涉及到以下几个方面:
1.不带重复数的全排列
2.带重复数的全排列
3.有限个数的全排列(例如从n个数里面选择m个数,m<n)
现在就以上几个方面把代码给大家,能理解则理解,不能理解就背下来,这种解法效率还是挺高的。
代码前提:所有的数据我都默认从0到n-1,如果在实际运用中,有可能需要进行变化。
1.不带重复数的全排列
#include<iostream> using namespace std; int t=0;//代表最后我算出来的结果数 int c[100];//例c[0]=2,在第0行中第一个元素在第2列(用下标莫见怪) bool isok(int row) { for(int x=0;x!=row;x++){//row代表所选的数不在同一行就可以; if(c[x]==c[row]){//如果他们在同一列就终止 return false; } } return true; } void queen(int n,int row) { if(row==n){ t++; for(int i=0;i<n;i++){ cout << c[i] << ‘ ‘; } cout << endl; return ; } else{ for(int x=0;x!=n;x++){ c[row]=x; if(isok(row)){ queen(n,row+1); } } } } int main() { int n; cin >> n; queen(n,0); cout << t; return 0; }
2.带重复数的全排列
#include<iostream> using namespace std; int t=0;//代表最后我算出来的结果数 int c[100];//例c[0]=2,在第0行中第一个元素在第2列(用下标莫见怪) void queen(int n,int row) { if(row==n){ t++; for(int i=0;i<n;i++){ cout << c[i] << ‘ ‘; } cout << endl; return ; } else{ for(int x=0;x!=n;x++){ c[row]=x; queen(n,row+1); } } } int main() { int n; cin >> n; queen(n,0); cout << t; return 0; }
带重复数的全排列,也就是说,我不需要考虑这一列是否有元素已经放入了,我想放就放
3.有限个数的全排列(例如从n个数里面选择m个数,m<n)
#include<iostream> using namespace std; int t=0; int c[100]; bool isok(int row) { for(int x=0;x!=row;x++){//row代表所选的数不在同一行就可以; if(c[x]==c[row]){//如果他们在同一列就终止 return false; } } return true; } void queen(int n,int m,int row) { if(row==m){ t++; for(int i=0;i<m;i++){ cout << c[i] << ‘ ‘; } cout << endl; return ; } else{ for(int x=0;x!=n;x++){ c[row]=x; if(isok(row)){ queen(n,m,row+1); } } } } int main() { int n,m;//从n个数选择m个数 cin >> n >> m; queen(n,m,0); cout << t; return 0; }
以上是关于回溯算法求关于排列有关问题的主要内容,如果未能解决你的问题,请参考以下文章