C++带分数(递归,枚举,嵌套深搜)

100 可以表示为带分数的形式:100=3+69258/714
还可以表示为:100=82+3546/197
注意特征:带分数中,数字 1∼9
分别出现且只出现一次(不包含 0)。
类似这样的带分数,100有 11种表示法。
输入格式
一个正整数。
输出格式
输出输入数字用数码 1∼9
不重复不遗漏地组成带分数表示的全部种数。
数据范围
1≤N<106
输入样例1:
100
输出样例1:
11
输入样例2:
105
输出样例2:
6

#include<iostream>
#include<string.h>

using namespace std;

int N;
bool g[20],backup[20];
long long ans=0;

bool check(int a,int c)//检查a和c是否合法
{
    
    
    int b=N*c-a*c;
    if(!a||!b||!c) return false;
    memcpy(backup,g,sizeof(g));
    int x;
    while(b)
    {
    
    
        x=b%10;//数字重了就不合法
        if(!x||backup[x]) return false;
        b/=10;
        backup[x]=true;
    }
    for(int i=1;i<=9;++i)//少一个数字没出现就不合法
        if(!backup[i]) return false;
    return true;
}

void dfs_c(int n,int a,int c)
{
    
    
    if(n>=9) return;//已经用了9个数字就绝对不合法
    if(check(a,c)) ++ans;

    for(int i=1;i<=9;++i)
        if(!g[i]){
    
    
            g[i]=true;
            dfs_c(n+1,a,c*10+i);
            g[i]=false;
        }
}

void dfs_a(int n,int a)
{
    
    
    if(a>=N) return;//a必须比N小,给b,c留数字
    
    if(a) dfs_c(n,a,0);

    for(int i=1;i<=9;++i)
        if(!g[i]){
    
    
            g[i]=true;
            dfs_a(n+1,a*10+i);
            g[i]=false;
        }
}

int main()
{
    
    
    cin>>N;
    dfs_a(0,0);//用了0个数字,a当前是0
    cout<<ans;
}

猜你喜欢

转载自blog.csdn.net/qq_44643644/article/details/108898250
今日推荐