#30652: C++解題絲路


chen199940@gmail.com (CGIBE)

學校 : 國立臺中科技大學
編號 : 179887
來源 : [59.126.118.193]
最後登入時間 :
2024-04-01 11:43:58
a524. 手機之謎 | From: [36.231.214.236] | 發表日期 : 2022-06-03 14:38

//char陣列儲存答案
//不用其他函式的寫法

優點:執行效率高(應該比前幾篇文章的程式還高,我沒仔細看...

#include <iostream>
#pragma GCC optimize("Ofast","unroll-loops","no-stack-protector")
using namespace std;
char num[8];//存放答案(輸入最大為8)
int n;//輸入的數字
void dfs(const int a,bool fg[]){
    if(a==n){//可以選都選完(表示fg[0~n-1]都為true)
        puts(num);//輸出並換行(不用迴圈跑)
        return;//直接離開避免多跑一次for
    }
    for(int i=n;i>0;i--){//簡單來講是做二選一(有選=>true;沒選=>false)進入到下個遞迴繼續做同一件事
        if(!fg[i-1]){
            fg[i-1]=true;
            num[a]=(char)(i+'0');//轉char(新增或者是覆蓋原本的資料)
            dfs(a+1,fg);
            fg[i-1]=false;
        }
    }
}
int main()
{
    ios_base::sync_with_stdio(false);
    char c;
    bool fg[8]={false};
    while(cin>>c){
        n=c-'0';//轉int
        for(int i=n;i<8;i++){//如果前面的輸入數字比現在大就覆蓋char[]後面的資料為NULL
            num[i]=NULL;//避免輸出後面接上筆(最後輸出)的答案
        }
        dfs(0,fg);
    }
    return 0;
}

 
ZeroJudge Forum