南沙C++信奥老师解一本通题: 1361:产生数(Produce)

[题目描述】

给出一个整数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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值