河南省之6 遥控器

  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     
原文地址:https://www.cnblogs.com/xiaofanke/p/3002076.html