• 河南省之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     
  • 相关阅读:
    HDU 5818 Joint Stacks
    HDU 5816 Hearthstone
    HDU 5812 Distance
    HDU 5807 Keep In Touch
    HDU 5798 Stabilization
    HDU 5543 Pick The Sticks
    Light OJ 1393 Crazy Calendar (尼姆博弈)
    NEFU 2016省赛演练一 I题 (模拟题)
    NEFU 2016省赛演练一 F题 (高精度加法)
    NEFU 2016省赛演练一 B题(递推)
  • 原文地址:https://www.cnblogs.com/xiaofanke/p/3002076.html
Copyright © 2020-2023  润新知