题目描述
小Y上课摸鱼的时候无聊,就在纸上数数,从1写到999999999,显然这样他的纸是不够用的,而且一节课肯定也不够用,所以他决定只写下那些长度为 N 的,而且相邻两个数码的差值为 K 的非负整数。
特别提示的是,数字0本身算长度为1的数字,但是前导零要忽略,比如070算长度为2。
输入
两个数字N,K。
其中:
1<= N <= 15
0<= K <= 9
输出
以从小到大的顺序输出所有满足条件的数字在一行里,数字之间用一个空格隔开。
输入样例
3 7
输出样例
181 292 707 818 929
// 注意070不是一个有效数字,因为忽略了前导零它长度只有2
思路
除了第一位不能为0外, 其他都可以,因此只需要将第一位特判一下,其他的正常dfs搜索即可。不过看下数据规模 1 <= N <= 15 哪怕是10^10都已经超时了,所以需要剪枝。
如果当前位为5,k = 3 的话, 那么下一位就只可能是2或8
代码
#include<iostream>
#include<cstdlib>
#include<math.h>
#include<string.h>
using namespace std;
typedef long long ll;
ll n, m;
void dfs(ll k, ll before, ll sum)
{
if(k > n)
{
cout << sum << " ";
return;
}
if(k == 1)
{
for(int i = 1; i <= 9; i++)
dfs(k + 1, i, i);
return;
}
if(before - m > -1)
dfs(k + 1, before - m, sum * 10 + before - m);
if(m == 0)
return;
if(before + m < 10)
dfs(k + 1, before + m, sum * 10 + before + m);
}
int main()
{
ios :: sync_with_stdio(0);
cin >> n >> m;
dfs(1,0,0);
return 0;
}