当前位置 : 主页 > 编程语言 > c++ >

B - You Are Given a Decimal String... CodeForces - 1202B

来源:互联网 收集:自由互联 发布时间:2021-06-23
#include bits/stdc++.h using namespace std; /* 这道题的难点在于怎样加x或者y才能使的a转化为b,并且加的x和y的和最少这道题竟然用了floyd,转换成求最短路这才深刻地体会到,我根本不会算法
#include <bits/stdc++.h>
using namespace std;
/*
这道题的难点在于怎样加x或者y才能使的a转化为b,并且加的x和y的和最少
这道题竟然用了floyd,转换成求最短路

这才深刻地体会到,我根本不会算法
*/
const int maxn=10;
const int INF=0x3f3f3f3f;
int dis[maxn][maxn];
int num[maxn][maxn];
const int len=2e6+10;
char s[len];
int length;
void work(int x,int y)
{
    memset(dis,INF,sizeof dis);//如果INf=0x3f,不能直接memset INF,直接memset 0x3f////0x3f3f3f3f(INF)
    for(int i=0; i<maxn; i++)
        dis[i][(i+x)%10]=dis[i][(i+y)%10]=1;
    for(int k=0; k<maxn; k++)
        for(int i=0; i<maxn; i++)
            for(int j=0; j<maxn; j++)
                dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
    for(int i=1; i<length; i++)
    {
        int a=s[i-1]-0;
        int b=s[i]-0;
        if(dis[a][b]==INF)
        {
            num[x][y]=-1;
            return ;
        }
        num[x][y]+=(dis[a][b]-1);
    }
}
int main()
{
    scanf("%s",s);
    length=strlen(s);
    for(int i=0; i<maxn; i++)
        for(int j=0; j<=i; j++)
        {
            work(i,j);
            num[j][i]=num[i][j];
        }
    for(int i=0; i<maxn; i++)
    {
        for(int j=0; j<maxn-1; j++)
            printf("%d ",num[i][j]);
        printf("%d\n",num[i][9]);
    }
    return 0;
}
网友评论