2-5: 有重复元素的排列问题:
参考代码:
#include#include #include #include #include using namespace std; //有重复问题的排列问题 int n; char a[101]; void Swap(int x,int y) { char t; t=a[x]; a[x] = a[y]; a[y] = t; } int issame(int x,int y) { for(int k=x; k >n; for(int i=1; i<=n; i++) { cin>>a[i]; } permutation(1); return 0; }
2-6:排列的字典序问题:
参考代码:
#include#include #include #include #include using namespace std; //排列的字典序问题 int n; char a[101]; int f[50]; int factorial(int m) { if(m == 1) { f[m] = 1; return f[m]; } f[m] = m * factorial(m-1); return f[m]; } int calculate() { int sum = 0; for(int i=1; i<=n; i++) { int coun = 0; int x = a[i] - '0'; for(int j=1; j<=i; j++) { if(a[j]<=a[i]) { coun++; } } sum+=(x-coun) *f[n-i]; } return sum; } void Swap(int x,int y) { char t; t = a[x]; a[x] = a[y]; a[y] = t; } void get_next()//获取字典序排列的下一种排列 { for(int i=n; i>=1; i--) { if(a[i]>n; for(int i=1; i<=n; i++) { cin>>a[i]; } int l = factorial(n); cout< 2-7:集合划分问题:
参考代码:
测试数据1
输入:5输出:
52#include#include #include #include #include using namespace std; // 集合划分问题 int sum; int set_part(int n,int m) { if(m == 1) return 1; if(n == m) return 1; return set_part(n-1,m-1)+m*set_part(n-1,m); } int main() { int n; cin>>n; sum = 0; for(int i=1; i<=n; i++) { sum+=set_part(n,i); } cout< 2-8 集合划分问题2
参考代码:#include#include #include #include #include using namespace std; // 集合划分问题2 int sum; int set_part(int n,int m) { if(m == 1) return 1; if(n == m) return 1; return set_part(n-1,m-1)+m*set_part(n-1,m); } int main() { int n,m; cin>>n>>m; sum = 0; cout< 2-9 双色Hanoi塔问题
参考代码:#include#include #include #include #include using namespace std; // 双色Hanoi塔问题 void move(int n, char a, char c, char b) { if(n == 1) { cout< >n; move(n,'A','C','B'); return 0; } 2-10:标准二维表问题:
解题思路: 利用进栈出栈相关
参考代码:#include#include #include #include #include using namespace std; // 标准二维表问题 long long a[1000]; void get_() { a[0] = 1; for(int i=1;i<1001;i++) { long long sum = 0; for(int j=0; j>n; get_(); cout< 书上例题
2-11 循环赛日程表
示例1
输入:8输出:
1 2 3 4 5 6 7 8 2 1 4 3 6 5 8 7 3 4 1 2 7 8 5 6 4 3 2 1 8 7 6 5 5 6 7 8 1 2 3 4 6 5 8 7 2 1 4 3 7 8 5 6 3 4 1 2 8 7 6 5 4 3 2 1参考代码:
#include#include #include #include #include using namespace std; // 循环赛日程表 int a[101][101]; void init_(int n) { for(int i=1; i<=n; i++) { a[i][1] = i; } } void set_part(int n,int l) { if(l == 1) return ; int nid = l/2; set_part(n,nid); int op = n/l; for(int k =0 ;k >n; init_(n); set_part(n,n); show(n); return 0; }



