$题解CF9C【進の番号】の$

$ CF9C進数の番号の$
Aユニバーサル - 対象は難しいことではありません、急いで言う\((QAQ)を\)
この問題の解決策の主なアイデア\(DFS \) \(DFS \)大法が良いです!)


要求出力の対象ため\(1-N \)は、各桁の自然数のみを含む\(0 \)\(1 \)の値の数、我々は含む各桁に沿った、ということを知っている\(0 \)\ (1 \)は最小数は少ないですか?もちろん\(1 \)これを行うのは明らかにされていません。だから、私たちは、dfsから必要があります\(1 \)検索を開始します。
また、各桁の自然数のみが含まれているため、と考えることができます\(0 \)\(1 \)ので、我々は再帰的に次のレベルに呼び出すことができます。

dfs(cur*10+1);  
dfs(cur*10);



dfs(1)    //在int main()中

この再帰呼び出しは必ずしも正確である、となぜですか?ビューでは、とき、簡単な例を与える(CUR == 1 \)を\、呼び出されるときdfs(11)dfs(10)、これら二つの数が質問の意味と一致している一方で、というように、それぞれの層を呼び出すと、自然に正しいですの。
境界再帰呼び出しは、それは何ですか?熱があるときif(cur>n) return;ならば\(CURの\は)されている\(> N \)そして再帰的にもちろん、あなたがしたいので、それのポイントが何であるか(リターン\)\。他の例限り、カウンタ\(ANS ++ \)その上に。
コードの一部が与えられます。

void dfs(int cur)
{
    if(cur>n) return;  //递归边界,return
    else ++ans;  //计数器++
    dfs(cur*10+1);  //递归调用
    dfs(cur*10);  //继续递归调用
}

この記事は、一般的なコンテンツ\(OK \) A。そして、完全なコード与える(\↓↓↓)\を

#include<bits/stdc++.h>
using namespace std;
int n,ans;
inline int read()  //我喜欢快读
{
     int x=0,f=1;char ch=getchar();
     while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=getchar();}
     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
     return x*f;
}
void dfs(int cur)
{
    if(cur>n) return;
    else ++ans;
    dfs(cur*10+1);
    dfs(cur*10);
}
int main()
{
    n=read();
    dfs(1);
    printf("%d",ans);  //输出ans的值
    return 0;
}

おすすめ

転載: www.cnblogs.com/Luke-Skywalker/p/11331265.html