寻找数字(dfs)

给定一个正整数 n,请你找到一个正整数 x,要求:

  1. x≥n
  2. x 的各个数位均不包含 4 和 7 以外的数字,且 x 中包含的 4 的数量与 7 的数量恰好相等。
  3. 满足前两个条件的前提下,x 应尽可能小。

输入格式

一个正整数 n。

输出格式

一个正整数,表示 x。

数据范围

前 66 个测试点满足1≤n≤5000。
所有测试点满足 1≤n≤10^9。

输入样例1:

4500

输出样例1:

4747

输入样例2:

47

输出样例2:

47

分析:最多有十位数,所以直接暴搜。暴搜是搜索所有的可能结果。

但自己写时候,由于dfs不够熟练,没写出来 

思路:定义一个字符串·ans作为答案,str作为中间变量,

再定义一个u作为记录枚举当前的数位,s4作为4出现的次数,s7作为7出现的次数。

如果当前 str 的 u 枚举到num的大小,开始判断,如果str>=num && (ans.empty()||ans>str)

更新当前的ans。

#include<iostream>
#include<string>

using namespace std;

string num;
string ans;

void dfs(string str,int u,int s4,int s7)
{
    if(u==num.size())
    {
        if(str >= num && s4==s7 && (ans.empty() || ans > str ))
           ans = str;
        return ;
    }
    
    if(s4 < num.size() / 2) dfs(str + '4',u + 1, s4 + 1,s7);//因为这里的判断条件,所以 
                                                          //return那里不需要判断是否s4==s7
    if(s7 < num.size() / 2) dfs(str + '7',u + 1, s4, s7 + 1);
}
int main()
{
    cin>>num;
    
    if(num.size()%2) num = '0' + num;
    
    dfs("",0,0,0);
    
    if(ans.empty())
    {
        //cout<<ans.empty()<<endl;if字符串为空,return 1
        num = "00" + num;
        dfs("",0,0,0);
    }
    
    cout<<ans<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值