1. 程式人生 > 實用技巧 >小猴程式設計演算法二階段-上課筆記

小猴程式設計演算法二階段-上課筆記

第三講

重點題:

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