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;

}
原文地址:https://www.cnblogs.com/yyroom/p/2989145.html