zoukankan      html  css  js  c++  java
  • 数码管编程题-编程练习题(100)

    目录

    问题:

    分析:

    C++代码:

    总结:


    问题:

    7.

    【问题描述】

    液晶数码管用七笔阿拉数字表示的十个数字,把横和竖的一 个短划都称为一笔,即7有3笔,8有7笔等。对于十个数字一种排列,要做到两相邻数字都可以由另一个数字加上几笔或减去几笔组成,但不能又加又减。比如 7→3是允许的,7→2不允许。任意输入一组数,判断是否符合上述规则,注意,1在右边。

    【输入形式】

    每行输入一个0~9的排列,数字之间用空格分隔,以-1作为输入结束

    【输出形式】

    输出YES或NO

    【样例输入】

    4 1 0 7 3 9 5 6 8 2
    3 5 1 6 2 7 9 0 4 8
    -1

    【样例输出】

    YES
    NO

    分析:

    方法1:可以把数码管的七笔进行编号,然后使用二维数字存储0-9十个数字所使用的数码管编号,如果两个数字编号交集等于其中一个数字的编号,则可以增几笔或减几笔变换,例如数字A用了编号1、3、5、7,数字B用了编号3、5,则Acap B=B:{3、5}。所以这个变换是允许的。

    方法2:方法1理论上可以实现,但是会比较麻烦,每两个相邻的数都要进行对比,也就是要循环7*(n-1)次,其中n为0-9一个排列中所含数的个数。所以我又想到了一个方法,将允许进行转换的数字存入一个key-value对中,如果可以通过key找到对应的value(相邻的数),则表示允许转换,但是这个怎么存储呢?在map中key是不允许有重复的,但是我们可以使用multimap,这个函数操作就不细说了。这里我使用另一种简单的方法,使用一个二维数组map_array[10][10],能相互转换的数字对应位置存1,不允许相互转换的存0。这样就可以在O(1)的时间内查看两个数字是否允许转换,相对于multimap来说就是造成了空间的浪费,但是相对于multimap来说数组的速度是要快的。

    C++AC代码:

    #include <iostream>
    
    using namespace std;
    
    int main()
    {                         //0 1 2 3 4 5 6 7 8 9  数字0-9互相转换映射表,正好是对称矩阵
        int map_array[10][10]={{1,1,0,0,0,0,0,1,1,0},  //0
                               {1,1,0,1,1,0,0,1,1,1},  //1
                               {0,0,1,0,0,0,0,0,1,0},  //2
                               {0,1,0,1,0,0,0,1,1,1},  //3
                               {0,1,0,0,1,0,0,0,1,1},  //4
                               {0,0,0,0,0,1,1,0,1,1},  //5
                               {0,0,0,0,0,1,1,0,1,0},  //6
                               {1,1,0,1,0,0,0,1,1,1},  //7
                               {1,1,1,1,1,1,1,1,1,1},  //8
                               {0,1,0,1,1,1,0,1,1,1}   //9
                              };
        int number[10];
        bool flag = true;
    
        while(1)
        {
            flag = true;
            cin >> number[0];
            if(-1 == number[0] )
            {
                break;
            }
            for(int i=1; i<10; i++)
            {
                cin >> number[i];                              //获取数字存入number[]
                if(1 != map_array[ number[i-1] ][ number[i] ]) //判断是否允许转换
                {
                    flag = false;
                }
            }
            if(false == flag)
            {
                cout << "NO" <<endl;
            }else{
                cout << "YES" <<endl;
            }
        }
        return 0;
    }
    

    总结:

    这道题不难,就是将映射表做出来花了点时间。仔细想想这道题也挺有意思。

  • 相关阅读:
    安装JDK,如何配置PATH,如何配置CLASSPATH
    存储过程笔记
    用BeanFactoryAware接口,用BEAN的名称来获取BEAN对象
    静态工厂实例代码
    setTimeout 和 setInterval 的区别
    Spring Autowire自动装配
    动态工厂模式代码实例
    JS处理回车事件
    不错的Spring学习笔记(转)
    单例模式要点
  • 原文地址:https://www.cnblogs.com/www-helloworld-com/p/10202956.html
Copyright © 2011-2022 走看看