zerojudge h098. 社長的考驗

題目請參考 https://zerojudge.tw/ShowProblem?problemid=h098.

這題我的想法很簡單, 就是把數字用從左到右的順序來試, 每一位都從0到9猜, 每猜一個數字就進入右一位. 這樣會有下面幾種情況.

狀況1.數字已超過20, 那後面位數也不用猜了, 回上一層換下一個數字繼續猜.

狀況2.剛好滿20, 那後面的位數都不用猜了, 一定都是0. 找到這一組答案後,回上一層換下一個數字繼續猜.

狀況3.猜了九位後,就不用再猜了, 回上一層換下一個數字繼續猜.

前面三個狀況都不是, 那從數字0到9猜一遍.

char number[20]="0 0 0 0 0 0 0 0 0";

char ascii[11]="0123456789";

void GetString(int index, int sum){

    //狀況1
    if(sum>20){
        return;
    }
    
    //狀況2
    if(sum==20){
        for(int i=index;i<9;i++){
            number[i<<1]='0';
        }
        printf("%s\n",number);
        return;
    }
    //狀況3
    if(index>=9){
        return;
    }


    //從0到9猜
    for(int i=0;i<10;i++){
        number[index<<1]=ascii[i];
        GetString(index+1, sum+i);
    }

}
C++

以下為完整程式碼, 執行時間約0.5秒.

#include <iostream>

using namespace std;


char number[20]="0 0 0 0 0 0 0 0 0";

char ascii[11]="0123456789";


void GetString(int index, int sum){

    //狀況1
    if(sum>20){
        return;
    }
    
    //狀況2
    if(sum==20){
        for(int i=index;i<9;i++){
            number[i<<1]='0';
        }
        printf("%s\n",number);
        return;
    }
    //狀況3
    if(index>=9){
        return;
    }


    //從0到9猜
    for(int i=0;i<10;i++){
        number[index<<1]=ascii[i];
        GetString(index+1, sum+i);
    }

}

int main()
{
    GetString(0,0);

    return 0;
}
C++

Comments

No comments yet. Why don’t you start the discussion?

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *