产生数(build)
【问题描述】
给出一个整数n(n<1030)和m个变换规则(m≤20)。
约定:一个数字可以变换成另一个数字,规则的右部不能为零,即零不能由另一个数字变换而成。而这里所说的一个数字就是指一个一位数。
现在给出一个整数n和m个规则,要你求出对n的每一位数字经过任意次的变换(0次或多次),能产生出多少个不同的整数。
【输入】
共m+2行,第一行是一个不超过30位的整数n,第2行是一个正整数m,接下来的m行是m个变换规则,每一规则是两个数字x、y,中间用一个空格间隔,表示x可以变换成y。
【输出】
仅一行,表示可以产生的不同整数的个数。
【样例】
build.in build.out
1 2 3 6
2
1 2
2 3
用C++自带的queue和map容器,代码如下
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <string>
#include <vector>
#include <map>
using namespace std;
queue<string> q;
bool ccha[10][10];
int cnum[10];
map<string,bool> vis;
void act(string a)
{
int nn;
string b;
for(int i=0;i<a.length();i++)
{
nn=a[i]-48;
if (cnum[nn]!=0)
{
b=a;
for(int j=0;j<=9;j++)
{
if (ccha[nn][j]==1)
{
b[i]=(char)(j+48);
if (vis[b]==0)
{
q.push(b);
vis[b]=1;
}
}
}
}
}
}
int main()
{
string n;
int m;
cin >> n;
cin >> m;
int x,y;
memset(ccha,0,sizeof(ccha));
memset(cnum,0,sizeof(cnum));
for(int i=1;i<=m;i++)
{
cin >> x >> y;
ccha[x][y]=1;
cnum[x]++;
}
q.push(n);
vis[n]=1;
int ans=0;
while(q.size()!=0)
{
ans++;
act(q.front());
q.pop();
}
cout << ans << endl;
return 0;
}

该博客讨论了一种使用C++内置的queue和map容器来解决数字变换问题的方法。问题要求从给定的整数n出发,根据不超过20个变换规则,计算能变换出的不同整数的个数。输入包括一个不超过30位的整数n和变换规则,输出是变换所能得到的不同整数的数量。提供的样例展示了如何应用这些规则从1开始,最终得到6个不同的整数。
1537

被折叠的 条评论
为什么被折叠?



