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