SSOJ1419产生数
4192+
作者:crxis 发布:2017-08-20 分类:搜索
题目大意:对于给定的一个数,你可以将其中的某个数字变成其他数字,新出来的数字也可以这样,最终能变出多少个数字?
题目描述
给出一个整数n(n<=2000)和k个变换规则(k≤15)。
规则:
① 1个数字可以变换成另1个数字;
② 规则中,右边的数字不能为零。
例如:n=234,k=2规则为
2 → 5
3 → 6
上面的整数234经过变换后可能产生出的整数为(包括原数)
234 534 264 564
共4种不同的产生数
求经过任意次的变换(0次或多次),能产生出多少个不同的整数。
仅要求输出不同整数个数。
规则:
① 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
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的即可,或者在标记时同时记录个数也是可以的。