1. 程式人生 > >藍橋杯——產生數

藍橋杯——產生數

題目描述 給出一個整數  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

思路:將規則描述成為一個完整的鄰接矩陣,找各個節點的鄰接節點數+1(包括自身),將所有點的鄰接節點數最後相乘既是最後答案。


  
 
 
import java.math.BigInteger;
import java.util.Scanner;


public class 產生數 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int k=sc.nextInt();
		//將輸入的數字轉化為字元陣列
		char chn[]=String.valueOf(n).toCharArray();
		int map[][]=new int[10][10];
		//錄入規則,a->b
		for (int i = 1; i <=k; i++) {
			int a=sc.nextInt();
			int b=sc.nextInt();
			map[a][b]=1;
		}
		//根據規則,更新每個數字能連結到的節點
		for (int i = 0; i < map.length; i++) {
			for (int j = 0; j < map.length; j++) {
				for (int div = 0; div < map.length; div++) {
					if(div!=i && div!=j && i!=j){
						if(map[i][div]==1 && map[div][j]==1){
							map[i][j]=1;
						}
					}
				}
			}
		}
		BigInteger sum=BigInteger.ONE;//初始化“總的可能情況數”
		for (int i = 0; i < chn.length; i++) {
			int x=chn[i]-'0';//轉化成int的節點下標
			int count=1;//初始化為1是因為,最後可能的數中包含自身,所以自身也是一種情況
			for (int j = 0; j < map.length; j++) {
				if(map[x][j]==1){//符合規則可以交換(走通)
					count+=map[x][j];//計算每一位數字最多能變為幾種數字
				}
			}
			String ss=String.valueOf(count);
			sum=sum.multiply(new BigInteger(ss));
		}
		System.out.println(sum);
	}
}