当前位置:首页 > 搜索 > 正文
SSOJ1419产生数
4167+

题目大意:对于给定的一个数,你可以将其中的某个数字变成其他数字,新出来的数字也可以这样,最终能变出多少个数字?

题目描述

给出一个整数n(n<=2000)和k个变换规则(k≤15)。
规则:
① 1个数字可以变换成另1个数字;
② 规则中,右边的数字不能为零。
例如:n=234,k=2规则为
2 → 5
3 → 6
上面的整数234经过变换后可能产生出的整数为(包括原数)
234 534 264 564
共4种不同的产生数
求经过任意次的变换(0次或多次),能产生出多少个不同的整数。
仅要求输出不同整数个数。

输入

输入格式为
n
k
x1 y1
x2 y2
… …
xn yn

输出

输出格式为一个整数(满足条件的整数个数)。

样例输入

234
2
2 5
3 6

样例输出

4

解题思路

最大的数字,也就是四位数,变过的数字就不再搜索,因此不会重复搜索,且每个数字仅需要尝试变“一次”,dfs和bfs都可以。(如果问的是至少多少步变成某个数字,那么广搜更更快些)

从第一个数字开始搜索,关键是如果写变换规则,因为他已经不再是单纯的往4个、8个方向走了,甚至每个位都有15个方向可走。那变换规则就一个一个写吧,每个位都看看能不能变,用while循环把每个位求出来,看看变换规则中的a有没有这个位的数字,有的话就让他变:让该位由a变为0,再由0变为b,即加上(b-a)*10的多少次方。能变到的数字,用f数组标记为非0,最后扫一遍f数组,看里面有多少个非0的即可,或者在标记时同时记录个数也是可以的。

程序实现

SSOJ1419产生数:等您坐沙发呢!

发表评论

您必须 [ 登录 ] 才能发表留言!