信息学奥赛一本通 数据结构 1361:产生数(Produce) 第二章 队列
上面的整数234经过变换后可能产生出的整数为(包括原数)234,534,264,564共4种不同的产生数。求经过任意次的变换(0次或多次),能产生出多少个不同的整数。仅要求输出不同整数个数。时间限制: 1000 ms内存限制: 65536 KB。给出一个整数n(n≤2000)和k个变换规则(k≤15)。格式为一个整数(满足条件的整数个数)。1361:产生数(Produce)① 1个数字可以变换成另
·
1361:产生数(Produce)
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
给出一个整数n(n≤2000)和k个变换规则(k≤15)。规则:
① 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
【输出】
格式为一个整数(满足条件的整数个数)。
【输入样例】
234
2
2 5
3 6
【输出样例】
4
解析:
详见代码:
#include <bits/stdc++.h>
using namespace std;
string n;
int k;
bool b[10000];//标记某个数是否出现过
int x[20],y[20];//变换规则
int ans=0;
queue<string> q;
void bfs() {
q.push(n);//种子入队
b[stoi(n)]=1;//标记出现过
ans++;//答案加一
while (q.size()) {//只要队列里有数
string xx=q.front();//取队首
q.pop();//弹出队首
for (int i=0;i<xx.length();i++) {//枚举每一位
for (int j=1;j<=k;j++) {//枚举每个变换规则
if (xx[i]==x[j]+'0') {//符合规则
string yy=xx;//临时变量
yy[i]=char(y[j]+'0');//按规则变化
if (b[stoi(yy)]==0){//如果没出现过
ans++;//答案加一
q.push(yy);//入队
b[stoi(yy)]=1;//标记出现过
}
}
}
}
}
return;//返回
}
int main() {
cin >>n>>k;
for (int i=1;i<=k;i++) {
cin >>x[i]>>y[i];
}
bfs();
cout <<ans<<endl;
return 0;
}
用int的解法:
#include <bits/stdc++.h>
using namespace std;
int n,k,f[10000],a[20],b[20],ans=0,x[20],z=1;
queue<int> q;
void bfs() {
q.push(n);
f[n]=1;
ans++;
while (q.size()) {
int xx=q.front();
z=1;
while (xx) {
x[z]=xx%10;
xx/=10;
z++;
}
for (int i=1;i<z;i++) {
for (int j=1;j<=k;j++) {
if (x[i]==a[j]) {
int y=0;
for (int l=z-1;l>=1;l--) {
if (l==i) {
y=y*10+b[j];
} else {
y=y*10+x[l];
}
}
if (f[y]==0) {
q.push(y);
f[y]=1;
ans++;
}
}
}
}
q.pop();
}
return ;
}
int main() {
cin >>n>>k;
for (int i=1;i<=k;i++) {
cin >>a[i]>>b[i];
}
bfs();
cout <<ans<<endl;
return 0;
}

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
所有评论(0)