小猴编程算法二阶段-上课笔记

第三讲

重点题:

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);
    }
}

 

posted @ 2020-07-13 19:45  elisa02  阅读(13)  评论(0编辑  收藏