Java实现 蓝桥杯VIP 算法提高 产生数

算法提高 产生数
时间限制:1.0s 内存限制:256.0MB

问题描述

给出一个整数 n(n<10^30) 和 k 个变换规则(k<=15)。

规则:

一位数可变换成另一个一位数:

规则的右部不能为零。

例如:n=234。有规则(k=2):

2-> 5

3-> 6

上面的整数 234 经过变换后可能产生出的整数为(包括原数):

234

534

264

564

共 4 种不同的产生数

问题:

给出一个整数 n 和 k 个规则。

求出:

经过任意次的变换(0次或多次),能产生出多少个不同整数。

仅要求输出个数。
  输入格式:
  n k
  x1 y1
  x2 y2
  … …
  xn yn
  输出格式:
  一个整数(满足条件的个数):
样例输入
234 2
2 5
3 6
样例输出
4

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.Vector;


public class 产生数 {
	static int[] v=new int[10];
	static Vector<Vector<Integer>> gz=new Vector<Vector<Integer>>();
	static int geti(int i){
		int a=1;
		v[i]=1;
		for (int j = 0; j <gz.get(i).size(); j++) {
			int k=gz.get(i).get(j);
			if(v[k]==1)continue;
			a+=geti(k);
		}
		return a;
	}
	public static void main(String[] args) throws IOException {
		for (int i = 0; i <10; i++) {
			gz.add(new Vector<Integer>());
		}
		BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
		String[] a1=bf.readLine().split(" ");
		int k=Integer.parseInt(a1[1]);
		int[] s=new int[a1[0].length()];
		for (int i = 0; i < a1[0].length(); i++) 
			s[i]=a1[0].charAt(i)-'0';
		for (int i = 0; i < k; i++) {
			a1=bf.readLine().split(" ");
			gz.get(Integer.parseInt(a1[0])).add(Integer.parseInt(a1[1]));
		}
		BigInteger num=new BigInteger("1");
		for (int i = 0; i < s.length; i++) {
			num=num.multiply(BigInteger.valueOf(geti(s[i])));
			v=new int[10];
		}
		//System.out.println(BigInteger.valueOf(2).pow(20));
		System.out.println(num);
	}

}

原文地址:https://www.cnblogs.com/a1439775520/p/13078925.html