首页 > 编程语言 >南沙C++信奥老师解一本通题: 1361:产生数(Produce)

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

时间:2024-09-15 09:45:48浏览次数:10  
标签:tmp cnt 信奥 cur int 整数 Produce 通题 234

 [题目描述】

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

相关文章

  • 南沙C++noip老师解一本通题: 1360:奇怪的电梯(lift)
    ​【题目描述】大楼的每一层楼都可以停电梯,而且第i层楼(1≤i≤N)上有一个数字Ki(0≤=Ki≤=N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:33125代表了Ki(K1=3,K2=3,……),从一楼开始。在一楼,按“上”可以到4......
  • 南沙C++信奥老师解一本通题: 1212:LETTERS
    ​ 题目描述】给出一个row×col的大写字母矩阵,一开始的位置为左上角,你可以向上下左右四个方向移动,并且不能移向曾经经过的字母。问最多可以经过几个字母。【输入】第一行,输入字母矩阵行数R和列数S,1≤R,S≤20。接着输出R行S列字母矩阵。【输出】最多能走过的不同字母......
  • 南沙C++信奥老师解一本通题: 1315:【例4.5】集合的划分
    ​ 【题目描述】【输入】给出n和k。【输出】n个元素a1,a2,……,an放入k个无标号盒子中去的划分数S(n,k)。【输入样例】106 【输出样例】22827 #include<iostream>usingnamespacestd;longlongSplit(intn,intplate)//等同于n个不同的数......
  • 南沙C++信奥老师解一本通题:1203:扩号匹配问题
    ​【题目描述】在某个字符串(长度不超过100)中有左括号、右括号和大小写字母;规定(与常见的算数式子一样)任何一个左括号都从内到外与在它右边且距离最近的右括号匹配。写一个程序,找到无法匹配的左括号和右括号,输出原来字符串,并在下一行标出不能匹配的括号。不能匹配的左括号用"$"标......
  • 信奥一本通题陈老师解题:1209:分数求和
    ​【题目描述】【输入】第一行是一个整数nn,表示分数个数,1≤n≤101≤n≤10;接下来nn行,每行一个分数,用"p/qp/q"的形式表示,不含空格,p,qp,q均不超过1010。【输出】输出只有一行,即最终结果的最简形式。若为分数,用"p/qp/q"的形式表示。【输入样例】21/21/3【输出样例】5/......
  • 南沙C信++奥赛陈老师解一本通题: 1205:汉诺塔问题
    ​【题目描述】约19世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根杆,最左边的杆上自上而下、由小到大顺序串着由64个圆盘构成的塔。目的是将最左边杆上的盘全部移到中间的杆上,条件是一次只能移动一个盘,且不允许大盘放在小盘的上面。这是一个著名的问题,几乎所有的教......
  • 信奥OJ的搭建
     第一步,服务器申请选择一:免费云服务器,免费虚拟主机如:阿贝云阿贝云提供了免费的云服务器和免费的云虚拟主机,可根据自己的实际应用情况选择。首先注册一个账户,然后需要支付0.3元做一个实名认证,如果实名认证成功了大概率会开通成功。如果失败了可能是服务器资源池......
  • 南沙信奥赛C++陈老师解一本通题: 1326:【例7.5】 取余运算(mod)
    ​【题目描述】【输入】输入b,p,k的值。【输出】【输入样例】2109【输出样例】2^10mod9=7 #include<iostream>#include<stdlib.h>usingnamespacestd;longlongb,p,k,ans=1;intmain(){ cin>>b>>p>>k; for(inti=1;i<=p;i++) { ans*=b;......
  • 南沙信奥赛C++陈老师解一本通题: 1171:大整数的因子
    ​ 【题目描述】已知正整数k满足2≤k≤9,现给出长度最大为30位的十进制非负整数c,求所有能整除c的k。【输入】一个非负整数c,c的位数≤30。【输出】若存在满足 c%k==0的k,从小到大输出所有这样的k,相邻两个数之间用单个空格隔开;若没有这样的k,则输出"none"。【输入样......
  • 南沙信C++陈老师解一本通题:1310:【例2.2】车厢重组
    ​【题目描述】在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转。一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转180度,则可以把相邻两节车厢的位置交换,用这种方法可以重新排列车厢的顺序。于是他就负责用这座桥将进站的车厢按车厢号从小到大排列......