B. You Are Given a Decimal String...(Folyd算法)

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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值