B. You Are Given a Decimal String...
题目:给出一个字符串s,每次给出(x,y),求出最少几次变换可以得到包含s串的数字串。
(字符串的形成过程:一开始只有一位为0,当前位置pos = 0,
由pos = 0,推到出pos = 1,a[1] = (a[0]+x)%10,或着 a[1] = (a[0]+y)%10,每次这样变换,得到一个包含字符串ss的最终
字符串的次数为num)。
输出一个10*10的矩阵,矩阵的每个单元(i,j)表示x = i,y = j的情况下得到包含字符串s的最少变换次数为多少。
思路:
求出0~9之间互相变换所需的最少变换次数,就是用Folyd求最短路。
然后判断是否能得变换得到字符串s,能够得到,输出最终结果。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e6+10;
const int inf = 1e9+10;
char ss[maxn];
int n,dis[12][12];
int f(int x,int y)
{
for(int i=0;i<10;i++)
for(int j=0;j<10;j++) dis[i][j] = inf;
for(int i=0;i<10;i++)
dis[i][(i+x)%10] = dis[i][(i+y)%10] = 1;
for(int k=0;k<10;k++)
{
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
dis[i][j] = min(dis[i][j],dis[i][k]+dis[k][j]);
}
}
int ans = 0;
for(int i=0;i<n-1;i++)
{
if(dis[ss[i]-'0'][ss[i+1]-'0'] >= inf)
return -1;
ans += dis[ss[i]-'0'][ss[i+1]-'0']-1;
}
return ans;
}
int main(void)
{
scanf("%s",ss);
n = strlen(ss);
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
cout<<f(i,j)<<" ";
cout<<endl;
}
return 0;
}