• 编程之美之将帅问题


    思路非常easy,可是要实现仅仅用一个字节还是有些难度的,一開始我在试图寻找有没有什么方法能够定义出2bit的变量。由于假设我们能够定义出这种变量,利用循环非常容易就能求解了。

    可惜的是,没有能够找到 <-_->!!

    于是,仅仅能硬着头皮写。为避免main过长。用到了两个宏定义,写完之后看到參考答案。感觉太巧妙了,瞬间学习了新技能。从答案来看 似乎仅仅有在自己定义数据类型的时候才干指定 char 这些数据类型在编译器中所占内存大小 <-_->!!

    和大神们的代码相比,自己的简直弱到爆了 !!

    原码例如以下:

    // ================【将帅问题】=================
    // @ author         :       zhyh2010
    // @ date           :       20150610
    // @ version        :       1.0
    // @ description    :       仅仅用1个字节
    // ===============【end 将帅问题】=================
    
    
    #include <stdio.h>
    #include <stdlib.h>
    
    // =================【去除相差 3 的整倍数的情形】===============
    #define OK(solution)                                                
        ((((solution & 0xF0) >> 4) - (solution & 0xF)) % 3 != 0)        
    
    #define output(solution)                
    {                                       
        switch ((solution & 0xF0) >> 4) /* 将 */ 
        {                                   
        case 0:                             
            printf("将:d10	");            
            break;                          
        case 1:                             
            printf("将:e10	");            
            break;                          
        case 2:                             
            printf("将:f10	");            
            break;                          
        case 3:                             
            printf("将:d9	");             
            break;                          
        case 4:                             
            printf("将:e9	");             
            break;                          
        case 5:                             
            printf("将:f9	");             
            break;                          
        case 6:                             
            printf("将:d8	");             
            break;                          
        case 7:                             
            printf("将:e8	");             
            break;                          
        case 8:                             
            printf("将:f8	");             
            break;                          
        default:                            
            break;                          
        }                                   
                                            
        /* 帅 */                         
        switch (solution & 0xF)             
        {                                   
        case 0:                             
            printf("帅:d3
    ");             
            break;                          
        case 1:                             
            printf("帅:e3
    ");             
            break;                          
        case 2:                             
            printf("帅:f3
    ");             
            break;                          
        case 3:                             
            printf("帅:d2
    ");             
            break;                          
        case 4:                             
            printf("帅:e2
    ");             
            break;                          
        case 5:                             
            printf("帅:f2
    ");             
            break;                          
        case 6:                             
            printf("帅:d1
    ");             
            break;                          
        case 7:                             
            printf("帅:e1
    ");             
            break;                          
        case 8:                             
            printf("帅:f1
    ");             
            break;                          
        default:                            
            break;                          
        }                                   
    }                                       
    
    // ================【自己的方法】============
    void method1()
    {
        unsigned char solution = 0;
    
        // 将
        for (; ((solution & 0xF0) >> 4) < 9; solution += 0x10)
        {
            // 帅
            solution &= 0xF0;
            for (; (solution & 0xF) < 9; solution += 0x01)
            {
                if (OK(solution))
                    output(solution);
            }
        }
    }
    
    // ================【书上的巧妙的方法】============
    void method2()
    {
        struct {
            unsigned char a : 4;
            unsigned char b : 4;
        } i;
    
        for (i.a = 1; i.a < 9; i.a++)
        {
            for (i.b = 1; i.b < 9; i.b++)
            {
                if (i.a % 3 != i.b % 3)
                {
                    printf("A = %d, B = %d
    ", i.a, i.b);
                }
            }
        }
    
    }
    
    void main()
    {
        method2();
    }
    
    
  • 相关阅读:
    String判空效率比较
    myeclipse数据库逆向hibernate教程
    博客使用说明和我的学习心得(技术路线和书单)
    【小记】go如何判断key是否在map中
    MySQL必知必会笔记——MySQL其他操作
    MySQL必知必会笔记——查询的进阶知识
    MySQL必知必会笔记——查询的基础知识
    MySQL必知必会笔记-Mysql基本操作
    Linux学习笔记:Linux命令之权限管理命令
    Linux学习笔记:用户与用户组
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5278700.html
Copyright © 2020-2023  润新知