ssl1257-产生数【图论,最短路】
生活随笔
收集整理的這篇文章主要介紹了
ssl1257-产生数【图论,最短路】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目
給出一個整數 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
… …
xk yk
234 2
2 5
3 6
輸出
一個整數(滿足條件的個數):
4
解題思路
用way[i][j]表示是否可以從數字i變為數字j。然后用Floyd算法計算數字互相轉換,然后每個數字的方式乘起來(要用高精)。
代碼
#include<cstdio> #include<cstring> using namespace std; char s[41]; short a[41]; int k,x,y,way[10][10],n,f[10]; void add(int x)//高精乘 {int g=0;for (int i=1;i<=40;i++){a[i]=a[i]*x+g;g=a[i]/10;a[i]%=10;} } void write()//高精輸出 {int x=40;while (a[x]==0) x--;for (int i=x;i>=1;i--) printf("%d",a[i]); } int main() {scanf("%s %d\n",s,&k);n=strlen(s);//數字長度for (int i=1;i<=k;i++){scanf("%d%d",&x,&y);way[x][y]=true;//表示可以從x變為y}for (int k=0;k<=9;k++)for (int i=0;i<=9;i++)for (int j=0;j<=9;j++)way[i][j]=(way[i][j] or way[i][k] and way[k][j]);//計算是否可以經過k從i變為jfor (int i=0;i<=9;i++){for (int j=0;j<=9;j++)if (i!=j && way[i][j]) f[i]++;f[i]++;//計算該數字的變化方式} a[1]=1;for (int i=0;i<n;i++){add(f[s[i]-48]);//乘}write();//輸出 }總結
以上是生活随笔為你收集整理的ssl1257-产生数【图论,最短路】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ssl1624-小萨的烦恼【图论,最短路
- 下一篇: ssl1762-工厂的烦恼【图论,最短路