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