zoukankan      html  css  js  c++  java
  • nyist 543 遥 控 器

    遥 控 器

    题目

    http://acm.nyist.net/JudgeOnline/problem.php?pid=543

    这题需要考虑的很多种情况

    称这个(—)键为转换键

    一、试图直接实现转换

    1 当这个数大于10 --

      然后判断这个转换键是否可用    不能,--》这里我们要计算这个y在9 ---0 这个频道中能不能转换,转换的次数是多少

                     能:1----》两个数字键都好

                        2----》一好一坏     找一个能实现这个转换的最接近这个数的数(使用上下功能找)

                       3 ----》都坏    找一个能实现这个转换的最接近这个数的数(使用上下功能找)

    2 小于10 ---》这儿数字键好 

             -------》坏了  找一个能实现这个转换的最接近这个数的数(使用上下功能找)

    二、使用我们上键进行转换

    三、使用我们的下键进行转换

    将上述的三个大情况进行判断看那个是次数最少

    下面是没有优化的代码 只是进行各大分类讨论

    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    
    int a[16];//遥控器按键
    
    int judge_anjian(int n)//1-9
    {
        if(n==0) return 13;
    
        else if(n%3 == 0)
            return n/3-1+n;
        else return n/3+n;
    }
    
    int judge_1(int x,int y)//直接跳转
    {
        int k = 0;
        int j,i;
    
        if(y >= 10)
        {
            if(a[12] == 0)
            {
                for(i = 9; i >= 0; i--)
                    {
                        if(a[judge_anjian(i)] == 1)
                            {
                                return (y - i)+1;
                                break;
                            }
                    }
    
            }
            else
            {
                int a1,b1;
                a1 = y/10;
                b1 = y%10;
    
                b1 = judge_anjian(b1);
    
                a1 = judge_anjian(a1);
    
    
                if(a[b1] == 1 && a[a1] == 1)//两个键都好
                    return 3;
    
                else if(a[a1] == 1 && a[b1] == 0)//大数键好 小数键坏了
                {
                    int max_s4 = -1;
                    int max_x4 = -1;
    
                    if(a[8] == 1)//使用上键找
                        for(i = y; i <= 99; i++)
                            if(a[judge_anjian(i/10)] == 1 && a[judge_anjian(i%10)] == 1)
                                {
                                    max_x4 = 3+fabs(i - y);
                                    break;
                                }
    
                    if(a[4] == 1)//使用下键
                    for(j = y; j >= 0; j --)
                        if(a[judge_anjian(j/10)] == 1 && a[judge_anjian(j%10)] == 1)
                            {
    
                                max_s4 = 3 + fabs(y - j);
                                break;
                            }
    
                if(max_s4 == -1 && max_x4 == -1) return -1;
                else
                {
                    if(max_s4 == -1) return max_x4;
                    else if(max_x4 == -1) return max_s4;
                    else return max_s4<max_x4?max_s4:max_x4;
                }
    
                }
    
                else if(a[a1] == 0 && a[b1] == 1)//大数的键坏了
                {
                    int max_s4 = -1;
                    int max_x4 = -1;
    
                    if(a[8] == 1)//使用上键找
                        for(i = y; i <= 99; i++)
                            if(a[judge_anjian(i/10)] == 1 && a[judge_anjian(i%10)] == 1)
                               {
                                   max_x4 = 3+ fabs(y - i);
                                    break;
                               }
    
                    if(a[4] == 1)//使用下键
                    for(j = y; j >= 0; j --)
                        if(a[judge_anjian(j/10)] == 1 && a[judge_anjian(j%10)] == 1)
                            {
                                max_s4 = 3 +fabs(j - y);
                                break;
                            }
    
                if(max_s4 == -1 && max_x4 == -1) return -1;
                else
                {
                    if(max_s4 == -1) return max_x4;
                    else if(max_x4 == -1) return max_s4;
                    else return max_s4<max_x4?max_s4:max_x4;
                }
    
                }
                else//两数字都坏
                {
                    if(a[4] == 0 && a[8] == 0) return -1;
                    else
                    {
                        int hh_x = -1;
                        int hh_s = -1;
    
                        if(a[4] == 1)
                        for(i = y; i <= 99 ; i++)
                            {
                                if(a[i/10] == 1 && a[i%10] == 1)
                                    {
                                        hh_s = judge_1(x,i)+ i - y;
                                    }
                                if(hh_s != -1) break;
                            }
                        if(a[8] == 1)
                        for(j = y; j >= 0; j--)
                            {
                                if(a[j/10] == 1 && a[j%10] == 1)
                                    {
                                        hh_x = judge_1(x,j)+y - j;
                                    }
                                if(hh_x != -1) break;
                            }
                        if(hh_s == -1 && hh_s == -1)  return -1;
                        else
                        {
                            if(hh_s == -1) return hh_x;
                            else if(hh_x == -1) return hh_s;
                            else return hh_s<hh_x?hh_s:hh_x;
                        }
    
                    }
                }
            }
        }
        else// < 10
            {
                if(1 == a[judge_anjian(y)])
                    return 1;
    
                else if(a[judge_anjian(y)] == 0)
                {
                    int max_ys = -1;
                    int max_yx = -1;
    
                if(a[8] == 1)//
                {
                    for(i = y; i < 10; i++)
                        if(a[judge_anjian(i)] == 1)
                            {
                                max_ys = fabs(y - i) +1;
                                break;
                            }
                }
    
                if(a[4] == 1)
                {
                    for(j = y; j >= 0; j--)
                    if(a[judge_anjian(j)] == 1)
                    {
                        max_yx = fabs(y-j) +1;
                        break;
                    }
                }
    
                if(max_ys == -1 && max_yx == -1) return -1;
                else
                {
                    if(max_ys  == -1) return max_yx;
                    else if(max_yx == -1)  return max_ys;
                    else return max_yx<max_ys?max_yx:max_ys;
                }
                }
            }
    }
    int judge_s(int x,int y)//使用上键
    {
        if(a[4] == 1)
            if(x <= y)
            {
                return fabs(y - x);
            }
            else
            {
                return fabs(99 - x) + y+1;
            }
         else return -1;
    }
    
    int judge_x(int x,int y)//使用下键
    {
        if(a[8] == 1)
        {
            if(x < y)
            return x+1 + fabs(99 - y+1);
            else
                return fabs(x - y);
        }
        else return -1;
    }
    
    int min(int x,int y)
    {
        if(x != -1 && y != -1)
            return x < y ? x:y;
        else if( x == -1 && y == -1)
            return -1;
        else
        {
           if(x == -1)
                return y;
            else if(y == -1)
                return x;
        }
    
    }
    
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            int i = 0;
            for(i = 1; i <= 13; i++)
                scanf("%d",&a[i]);
    
            int min0 = 0;
            int min1,min2,min3;
            int x,y;
            scanf("%d%d",&x,&y);
            if(x == y) printf("0\n");
            else
            {
            min1 = judge_1(x,y);
            min2 = judge_s(x,y);
            min3 = judge_x(x,y);
            min0 = min(min(min1,min2),min3);
            printf("%d\n",min0);
            }
    
        }
        return 0;
    
    }
    
  • 相关阅读:
    C语言探索之旅 | 第二部分第二课:进击的指针,C语言的王牌!
    C语言探索之旅 | 第二部分第一课:模块化编程
    C语言探索之旅 | 第一部分练习题
    C语言探索之旅 | 第一部分第十一课:函数
    数据结构和算法 | 第一部分第五课:算法复杂度实践
    数据结构和算法 | 第一部分第四课:算法复杂度(下)
    数据结构和算法 | 第一部分第三课:算法复杂度(上)
    数据结构和算法 | 第一部分第二课:小鸭子们去旅行
    数据结构和算法 | 第一部分第一课:什么是数据结构和算法
    C语言探索之旅 | 第一部分第十课:第一个C语言小游戏
  • 原文地址:https://www.cnblogs.com/yyroom/p/2989145.html
Copyright © 2011-2022 走看看