第三讲
重点题:
1、123好数
a[i]里存的是数字的第i位是1, 2还是3
t存的是每个数的第p位和第p-1位都是什么数字(当做两位数来判断)
如果是12,23或者31,说明不能不是123好数
void search(int p){//枚举a[i] if(p > n){ cnt++; if(cnt == k){ for(int i = 1;i <= n;i++){ cout << a[i]; } cout << endl; } return; } for(a[p] = 1;a[p] < 4;a[p]++){ int t = a[p-1]*10 + a[p]; if(t == 12 || t == 23 || t == 31){ continue; } search(p+1); } }
2、d好数
前一个数和后一个数的绝对值不能超过d才能称为d好数
void search(int p){//枚举a[i] if(p > n){ cnt++; return; } for(int i = 1;i <= m;i++){ int t = a[p] - a[p-1]; if(abs(t) > d && p != 1){ continue; } search(p+1); } }
3、组合枚举
给出1~n,n个数中选出m个数
例如:
1 2
1 3
1 4
2 3
2 4
3 4
a[i]存的是每个数
如果已经递归到n了,输出
如果还没到n,也还没选m个数呢,我可以选一个数(从x开始),继续递归,我已经选的数+1,我选到几了+1
void pick(int x,int y){ if(y == n){ for(int i = 0;i < n;i++){ cout << a[i] << ' '; } cout << endl; return; } for(int i = x;i <= m;i++){ a[y] = i; pick(i+1,y+1); } }