输出一二三的全排列
1.可以用暴力枚举(真的有点暴力)
从一开始往后枚举,如果已经又该元素那么便跳过它,废话不说来代码。
#include<iostream> using namespace std; void p1() { for(int i=1;i<=3;i++) for(int j=1;j<=3;j++) for(int z=1;z<=3;z++) { if(i==j||j==z||i==z) continue; cout<<i<<j<<z<<endl; } } int main() { p1(); return 0; }
静静地观察我们发现有一些浪费,有一些根本不合逻辑的可以直接在第二步否掉,比如说如果i==j那么就不用做第三部循环了,所以改善一下。
2.剪枝枚举
将不符合逻辑的剪掉
#include<iostream> using namespace std; void p2() { for(int i = 1;i<=3;i++) { for(int j=1;j<=3;j++) { if(i==j) continue; for(int z = 1;z<=3;z++) { if(z==j||z==i) continue; cout<<i<<j<<z<<endl; } } } } int main() { p2(); return 0; }
3.还可以用桶数组标记
#include<iostream> using namespace std; int lalala[200]; void p3() { for(int i = 1;i<=3;i++) { lalala[i] = 1; for(int j=1;j<=3;j++) { if(lalala[j]) continue; lalala[j] = 1; for(int z = 1;z<=3;z++) { if(lalala[z]) continue; cout<<i<<j<<z<<endl; } lalala[j] = 0; } lalala[i] = 0; } } int main() { p3(); return 0; }
刚刚学习,有些鄙陋,敬请见谅
未完待续.....