藍橋杯——產生數
阿新 • • 發佈:2019-01-04
題目描述
給出一個整數 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 輸出 一個整數(滿足條件的個數) 樣例輸入
樣例輸出
規則:
一位數可變換成另一個一位數:
規則的右部不能為零。
例如: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); } }