产生数(Produce)
链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1361时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
给出一个整数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 y1
x2 y2
… …
xn yn
【输出】
格式为一个整数(满足条件的整数个数)。
【输入样例】
234 2 2 5 3 6
【输出样例】
4
#include<iostream> #include<cstring> #include<cstdio> #include<queue> #include<vector> using namespace std; int a[25]; bool b[12]; queue <int>Q; vector<int>G[15]; int bfs(int x) { int t=1; Q.push(x); b[x]=1; while(!Q.empty()) { int u=Q.front(); Q.pop(); for(int i=0;i<G[u].size();i++) { int v=G[u][i]; if(!b[v]) { t++;Q.push(v);b[v]=1; } } } return t; } int main() { string s; int ans=1,k; cin>>s>>k; for(int i=1;i<=k;i++) { int u,v; cin>>u>>v; G[u].push_back(v); } for(int i=0;i<s.size();i++) { memset(b,0,sizeof(b)); ans*=bfs(s[i]-‘0‘); } cout<<ans<<endl; }