zoukankan      html  css  js  c++  java
  • 火柴移动面试题

    最近我的一个朋友找到了一份工作,采访公司,我们遇到了一个火柴棍移动面试题,我觉得有点意思,在此抛砖引玉。


    题目大致是这种:

    一个三个数的式子,移动当中一根火柴。使等式成立。用程序或实现(能够用伪码),输出能成立的等式。

    注:“+”能够移走一根火柴变成“-”

    比如:



    废话不说,直接上代码,哪位网友有更好的方法,请分享一下,多谢

    #include <stdio.h>
    
    /* 定义操作符号,"+"或"-" */
    #define SYMBOL_ERROR 0
    #define SYMBOL_ADD   1
    #define SYMBOL_MINUS 2
    
    /* 定义变化标识,取值原则:3个中随便取出n个相加不能等于当中一个数 */
    #define FLAG_NO    0     /* 没有移动 */
    #define FLAG_MINUS 10    /* 去一根火柴 */
    #define FLAG_ADD   100   /* 添加一根火柴 */
    #define FLAG_SELF  1000  /* 拿一根放自己身上另外的位置 */
    
    /* 定义合法移动 */
    #define MOVE_TO_ANOTHER 110   /* 10 + 100 + 0,一个数拿一根,放到还有一个数上 */
    #define MOVE_TO_SELF    1000  /* 1000 + 0 + 0,自己拿一根放自己身上其它位置 */
    #define MOVE_FROM_PLUS  100   /* 100 + 0 + 0,从加号上拿一根放一个数身上 */
    
    /* 定义火柴移动结构体 */
    typedef struct matchstick
    {
        int iFlag; /* 变化标识 */
        int iData; /* 火柴表示的数 */
    }MATCH_STICK_S;
    
    /* 
      获取一个数不动或移动一根火柴后得到的数(仅仅列举3和6,其它数值相似)
      入參:指定的数(0-9)
      出差:MATCH_STICK_S结构数组
      返回值:移动一根火柴得到的数的个数
    */
    int getDataAfterMoveStick(int iData, MATCH_STICK_S *pstStick)
    {
        int iCount = 0;
        
        switch(iData)
        {
            case 3:
            {
                pstStick[0].iFlag = FLAG_NO; pstStick[0].iData = 3;   /* 不动 */
                pstStick[1].iFlag = FLAG_ADD; pstStick[1].iData = 9;  /* 加一根 */
                pstStick[2].iFlag = FLAG_SELF; pstStick[2].iData = 2; /* 自己移动一根 */
                pstStick[3].iFlag = FLAG_SELF; pstStick[3].iData = 3;
                pstStick[4].iFlag = FLAG_SELF; pstStick[4].iData = 5;
                iCount = 5;
                break;
            }
            case 6:
            {
                pstStick[0].iFlag = FLAG_NO; pstStick[0].iData = 6;    /* 不动 */
                pstStick[1].iFlag = FLAG_ADD; pstStick[1].iData = 8;   /* 加一根 */
                pstStick[5].iFlag = FLAG_MINUS; pstStick[5].iData = 5; /* 减一根 */
                pstStick[2].iFlag = FLAG_SELF; pstStick[2].iData = 0;  /* 自己移动一根 */
                pstStick[3].iFlag = FLAG_SELF; pstStick[3].iData = 6;
                pstStick[4].iFlag = FLAG_SELF; pstStick[4].iData = 9;            
                iCount = 6;
                break;
            }
            default:
            {
                break;
            }
        }
        
        return iCount;
    }
    
    /* 移动火柴
       返回值:
       SYMBOL_ERROR:非法移动
       SYMBOL_MINUS:从"+"上取一根加到某个数上
       SYMBOL_ADD:  不从"+"取火柴时,移动一根
     */
    char checkStickMove(int iFlag1, int iFlag2, int iFlag3)
    {
        char cSymbol = SYMBOL_ERROR;
        int iFlagSum = iFlag1 + iFlag2 + iFlag3;
        
        if((MOVE_TO_ANOTHER == iFlagSum) || (MOVE_TO_SELF == iFlagSum))
        {
            cSymbol = SYMBOL_ADD;
        }
        else if(MOVE_FROM_PLUS == iFlagSum)
        {
            cSymbol = SYMBOL_MINUS;
        }
        
        return cSymbol;
    }
    
    /* 满足移动规则,并能使等式成立的,打印出来 */
    void printResult(MATCH_STICK_S *pstStick1, MATCH_STICK_S *pstStick2, MATCH_STICK_S *pstStick3)
    {
        int iFlag1 = pstStick1->iFlag;
        int iFlag2 = pstStick2->iFlag;
        int iFlag3 = pstStick3->iFlag;
        int iData1 = pstStick1->iData;
        int iData2 = pstStick2->iData;
        int iData3 = pstStick3->iData;
        
        char cSymbol = checkStickMove(iFlag1, iFlag2, iFlag3);
        
        if((SYMBOL_ADD == cSymbol) && (iData3 == iData1 + iData2))
        {
        	printf("%d + %d = %d
    ", iData1, iData2, iData3);
        }
        else if((SYMBOL_MINUS == cSymbol) && (iData3 == iData1 - iData2))
        {
        	printf("%d - %d = %d
    ", iData1, iData2, iData3);
        }
        
        return;
    }
    
    /* 处理火柴移动 */
    void dealStickMove(int iData1, int iData2, int iData3)
    {
        unsigned long ulLoop1, ulLoop2, ulLoop3;   
        int iCount1, iCount2, iCount3;
        MATCH_STICK_S astStick1[10];
        MATCH_STICK_S astStick2[10];
        MATCH_STICK_S astStick3[10];
        
        iCount1 = getDataAfterMoveStick(iData1, astStick1);
        iCount2 = getDataAfterMoveStick(iData2, astStick2);
        iCount3 = getDataAfterMoveStick(iData3, astStick3);
        
        for(ulLoop1 = 0; ulLoop1 < iCount1; ulLoop1++)
        {
            for(ulLoop2 = 0; ulLoop2 < iCount2; ulLoop2++)
            {
                for(ulLoop3 = 0; ulLoop3 < iCount3; ulLoop3++)
                {
                    printResult(&astStick1[ulLoop1], &astStick2[ulLoop2], &astStick3[ulLoop3]);
                }
            }
        }
    
        return;
    }
    
    int main()
    {
        dealStickMove(3, 6, 3);
        
        return 0;
    }
    


    执行结果:

    3 + 0 = 3
    9 - 6 = 3

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    KindEditor
    JS缺失错误- Uncaught SyntaxError: Unexpected token <
    JS
    SQL
    Bootstrap
    CSS-筛选 获取第一个td
    订单号创建并发问题
    保存对象时碰到的问题-列名 'Discriminator' 无效
    ViewBag对象的更改
    Kafka协议兼容性改进
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4850695.html
Copyright © 2011-2022 走看看