产生数(信息学奥赛一本通-T1361)
生活随笔
收集整理的這篇文章主要介紹了
产生数(信息学奥赛一本通-T1361)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【題目描述】
給出一個整數n(n≤2000)和k個變換規則(k≤15)。規則:
????① 1個數字可以變換成另1個數字;
????② 規則中,右邊的數字不能為零。
例如:n=234,k=2規則為2 → 5,3 → 6
上面的整數234經過變換后可能產生出的整數為(包括原數)234,534,264,564共4種不同的產生數。
求經過任意次的變換(0次或多次),能產生出多少個不同的整數。僅要求輸出不同整數個數。
【輸入】
n
k
x1 x2 … xn
y1 y2 … yn
【輸出】
格式為一個整數(滿足條件的整數個數)。
【輸入樣例】
234
2
2 5
3 6
【輸出樣例】
4
【源程序】
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<string> #include<cstdlib> #include<queue> #include<vector> #define INF 0x3f3f3f3f #define PI acos(-1.0) #define N 10001 #define MOD 123 #define E 1e-6 using namespace std; int vis[N]; char q[N][10]; struct node{int x;int y; }b[20]; int turn(char s[],int len) {int ans=0;for(int i=0;i<len;i++){ans*=10;ans+=s[i]-'0';}return ans; } int main() {char s_t[10];char s[10];int k;cin>>s;int len=strlen(s);cin>>k;for(int i=1;i<=k;i++)cin>>b[i].x>>b[i].y;int head=1,tail=1;int cnt=1;strcpy(q[tail],s);tail++;vis[turn(s,len)]=1;while(head<tail){for(int i=1;i<=k;i++){strcpy(s_t,q[head]);for(int j=0;j<len;j++)if(s_t[j]==b[i].x+'0'){s_t[j]=b[i].y+'0';int d=turn(s_t,len);if(vis[d]==0){vis[d]=1;strcpy(q[tail],s_t);tail++;cnt++;}strcpy(s_t,q[head]);//初始化s_t}}head++;}cout<<cnt<<endl;return 0; }?
總結
以上是生活随笔為你收集整理的产生数(信息学奥赛一本通-T1361)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 暑期训练日志----2018.8.9
- 下一篇: 公共子序列(信息学奥赛一本通-T1297