AcWing 4868. 数字替换(剪枝搜索)

在这里插入图片描述
代码:

#include<bits/stdc++.h>
using namespace std;

int minn = 0x3f3f3f3f;
typedef long long ll;
int n;
long long x;

void dfs(ll v , int times)
{
    
    
    if(times >= minn)
        return;
    int a[10] = {
    
    0};
    ll v1 = v,k = 0;
    while(v)
    {
    
    
        a[v % 10] = 1;
        k++;
        v/=10;
    }
    // cout << v1 <<"  "<< times << "  " << k << endl;
    // 剪枝
    if(k == n)
    {
    
    
        minn = min(times , minn);
        return;
    }
    
    if(n - k + times >= minn)
    {
    
    
        return;
    }
    
    // 深搜
    for(int i = 9; i > 1; i--)
    {
    
    
    	ll m = i * v1;
    	if(a[i]) dfs(m , times + 1);
    }
}

int main()
{
    
    
    cin >> n >> x;
    dfs(x , 0);
    if(minn == 0x3f3f3f3f) cout << -1 << endl;
    else cout << minn;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_63388363/article/details/129341672