也许求调帖子应该要有一个吸引人的标题吗(大雾)
代码如下:
#include<iostream>
#include<string>
using namespace std;
string turning_rule[15];
int num_of_turning[10];
bool vis[10];
int k;
struct HPN{ //高精度,num[0]用于存放数字位数
int num[50] = {1,1};
}ans;
void dfs(int n){
vis[n] = true;
for(int i = 0;i < k;i += 1)
{
if(turning_rule[i][0] - '0' == n && !vis[turning_rule[i][2] - '0']) //如果有可以变化的数字且变化后的数字未被统计过
{
dfs(turning_rule[i][2] - '0');
}
}
return;
}
struct HPN multiply(struct HPN a,int n){ //处理高精乘低精
int x = 0;
for(int i = 1;i <= a.num[0];i += 1)
{
a.num[i] *= n;
a.num[i] += x;
x = a.num[i] / 10;
a.num[i] %= 10;
}
a.num[0] += (x == 0 ? 0 : 1); //处理最后一位的进位
a.num[a.num[0]] += x;
return a;
}
int main(){
string n;
cin>>n>>k;
cin.ignore();
for(int i = 0;i < k;i += 1)
{
getline(cin,turning_rule[i]);
}
for(int i = 0;i <= 9;i += 1) //对每个数字可能转变的个数进行遍历
{
for(int j = 0;j <= 9;j += 1) //初始化数组
{
vis[j] = false;
}
dfs(i);
for(int j = 0;j <= 9;j += 1) //统计可能的数字个数
{
if(vis[j])
{
num_of_turning[i] += 1;
}
}
}
for(int i = 0;i < n.length();i += 1)
{
ans = multiply(ans,num_of_turning[n[i] - '0']); //乘法原理求解
}
for(int i = ans.num[0];i >= 1;i -= 1)
{
cout<<ans.num[i];
}
return 0;
}
总而言之,情况如标题所示,除#3其余全WA,求各位dalao进行debug或者求点hack数据QAQ(题目数据下载了是没问题的),有用必关谢谢喵