1 #include<stdio.h> 2 3 int a[4][4]; 4 typedef struct 5 { 6 int x; 7 int y; 8 }node; 9 node s[10]; 10 11 void cs()//用来存放数字的结构体,x,y分别是他们的行列坐标 12 { 13 s[0].x=3;s[0].y=1; 14 s[1].x=0;s[1].y=0; 15 s[2].x=0;s[2].y=1; 16 s[3].x=0;s[3].y=2; 17 s[4].x=1;s[4].y=0; 18 s[5].x=1;s[5].y=1; 19 s[6].x=1;s[6].y=2; 20 s[7].x=2;s[7].y=0; 21 s[8].x=2;s[8].y=1; 22 s[9].x=2;s[9].y=2; 23 } 24 25 int fun(int m,int n)//判断m到n的最短方式 26 { 27 int i,j,u,v,f,X,Y; 28 u=v=f=100; //初始化,保证最后判断是否可以调到 29 if(n==m) return 0;//如果相等就不用调 30 if(n<10 &&a[s[n].x][s[n].y]) //如果小于10并且这个数字存在就直接返回1 31 return 1; 32 if(n>9&&a[3][0])//如果大于10,别且两个数的行列坐标都在,可以3步完成,记录下f=3; 33 { 34 X=n/10;Y=n%10; 35 if(a[s[X].x][s[X].y]&&a[s[Y].x][s[Y].y]) 36 f=3; 37 } 38 if(a[0][3])//如果向上调节的键存在 39 { 40 u=(n-m+100)%100; //u初始化为直接向上调的数 41 for(i=n,j=0;j<u-1;i--,j++)//一位数时情况 42 { 43 if(i<0) i=99; 44 if(i<10&&a[s[i].x][s[i].y]) 45 { 46 u=j+1;break; 47 } 48 } 49 if(a[3][0])//两位数时情况 50 for(i=n,j=0;j<u-3;i--,j++) 51 { 52 if(i<0) i=99; 53 if(i>9) 54 { 55 X=i/10;Y=i%10; 56 if(a[s[X].x][s[X].y]&&a[s[Y].x][s[Y].y]) 57 { 58 u=u<j+3?u:j+3;break; 59 } 60 } 61 } 62 } 63 if(a[1][3]) 64 { 65 v=(m-n+100)%100; 66 for(i=m,j=0;j<v-1;i++,j++) 67 { 68 if(i>99) i=0; 69 if(i<10&&a[s[i].x][s[i].y]) 70 { 71 v=j+1;break; 72 } 73 } 74 if(a[3][0]) 75 for(i=n,j=0;j<v-3;i++,j++) 76 { 77 if(i>99) i=0; 78 if(i>9) 79 { 80 X=i/10;Y=i%10; 81 if(a[s[X].x][s[X].y]&&a[s[Y].x][s[Y].y]) 82 { 83 v=v<j+3?v:j+3; 84 break; 85 } 86 } 87 } 88 } 89 f=f<u?f:u; 90 return f<v?f:v;//最后返回最小值 91 } 92 93 int main() 94 { 95 int t,i,j,n,m,p; 96 cs(); 97 scanf("%d",&t); 98 while(t--) 99 { 100 for(i=0;i<4;i++) 101 for(j=0;j<4;j++) 102 { 103 if(i==2&&j==3||i==3&&j>1) 104 continue; 105 scanf("%d",&a[i][j]); 106 } 107 scanf("%d%d",&m,&n); 108 p=fun(m,n); 109 if(p==100) 110 printf("-1\n"); 111 else 112 printf("%d\n",p); 113 } 114 return 0; 115 } 116 117