描述
给出一个整数n(n<=2000)和k个变换规则(k≤15)。规则:
① 1个数字可以变换成另1个数字;
② 规则中,右边的数字不能为零。
例如:n=234,k=2规则为
2 → 5
3 → 6
上面的整数234经过变换后可能产生出的整数为(包括原数)234,534,264,564共4种不同的产生数。求经过任意
次的变换(0次或多次),能产生出多少个不同的整数。仅要求输出不同整数个数。
① 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
k
x1 y1
x2 y2
… …
xn yn
输出
格式为一个整数(满足条件的整数个数)。
输入输出样例
输入样例1
234 2 2 5 3 6
输出样例1
4
解题思路
这道题,我用的string存的数字,用map映射是否找到过,用vector记录变化规则,用queue当DFS来查找,最后记得特判最后一位0的情况。
题解
1 #include<bits/stdc++.h> 2 using namespace std; 3 vector<int> v[1001]; 4 map<string,int> sj; 5 queue <string> q; 6 int k,ans; 7 string n; 8 int main() 9 { 10 cin>>n>>k; 11 while(k--)//输入规则 12 { 13 int x,y; 14 cin>>x>>y; 15 v[x].push_back(y); 16 } 17 ans++;//本来自己就是一种方法 18 sj[n]=1;//标记 19 q.push(n); 20 while(!q.empty()) 21 { 22 string s=q.front();//取队头 23 q.pop(); 24 for(int i=0;i<s.size();i++)//一位一位看 25 { 26 int num=s[i]-'0';//记录数字 27 for(int j=0;j<v[num].size();j++)//看能不能变化 28 { 29 s[i]=v[num][j]+'0';//变化它 30 if(i==s.size()-1&&s[i]=='0')break;//特判最后一位变成0 31 if(!sj[s])//没找过 32 { 33 sj[s]=1;//标记 34 ans++;//方案加一 35 q.push(s);//塞进队列 36 } 37 s[i]=num+'0';//还原 38 } 39 } 40 } 41 cout<<ans;//输出 42 return 0; 43 }