[题目描述】
给出一个整数n(n≤2000)和k个变换规则(k≤15)。规则:
① 1个数字可以变换成另1个数字;
② 规则中,右边的数字不能为零。
例如:n=234,k=2规则为
2 → 5
3 → 6
上面的整数234经过变换后可能产生出的整数为(包括原数)234,534,264,564共4种不同的产生数。
求经过任意次的变换(0次或多次),能产生出多少个不同的整数。仅要求输出不同整数个数。
【输入】
【输出】
格式为一个整数(满足条件的整数个数)。
【输入样例】
234
2
2 5
3 6
【输出样例】
4
#include <bits/stdc++.h>
using namespace std;
int n,k,ans=1,v[10001],b[5],cnt; //v数组要设大,设成2000过不了,因为转换后数数可能9000
struct Node
{
int x,y;
}a[20];
void numtoArr(int n)
{
int tmp[5];
cnt=0;
while(n)
{
tmp[cnt++]=n%10;
n/=10;
}
for(int i=cnt-1,j=0;i>=0;i--,j++)
b[j]=tmp[i];
}
int arrToNum()
{
int newnum=0;
for(int i=0;i<cnt;i++)
newnum=newnum*10+b[i];
return newnum;
}
void bfs(queue<int> q)
{
while(q.empty()==false)
{
int cur=q.front();
q.pop();
v[cur]=1;
numtoArr(cur); //将队首元素转换成数组按顺序存放
for(int i=0;i<cnt;i++) //查看数的每一位
{
for(int j=1;j<=k;j++)
{
if(b[i]==a[j].x) //有需要替换的
{
b[i]=a[j].y;
int newn=arrToNum();
if( v[ newn] ==0 )
{
ans++;
v[newn]=1;
q.push(newn) ;
}//if
b[i] = a[j].x;//还原,否则只能用一次
}//if
}//for j
}//for i
}//while
}
int main()
{
cin>>n>>k;
memset(v,0,sizeof(v));
queue<int> q;
for(int i = 1; i <= k; ++i)
cin >> a[i].x >> a[i].y;
q.push(n);
v[n]=1;
bfs(q);
cout<<ans;
return 0;
}
标签:tmp,cnt,信奥,cur,int,整数,Produce,通题,234 From: https://www.cnblogs.com/nanshaquxinaosai/p/18414987