编程之美_象棋



最近在看编程之美,颇有感触。

我把在第二章的一些想法思路写下来。

 

非常感谢刘未鹏,看了他的博客也让我坚定了写一些东西的决心,经过自己思考的东西都有价值,至少对自己哟价值,写的东西可能上不了台面,事实上不管你有多厉害,总会有比你更厉害的人。敢写出来也比不敢写出来好。

 

题目是这样的,只使用一个变量把两边的“帅”,”的所有可能的位置输出。

 

都知道 不能在一条直线上,也就是不能面对面,把位置编号 1 2 3.。。。。9,共9个位置,再来分析,位置之间的关联性

如果A1 那么B不能在 1 4 7 这三个位置。其他的同理。

 

数字之间的关系就是

Wa表示A的位置,Wb表示B的位置

Wa%3 == Wb%3

 

这里就是第一种方法,我称之为逆向思维,找出不可能的位置,书上的3中方法中都是逆向思维。

 

还有第二种方法 自然就是正向思维了

直接找出可能存在的位置

不过在本题中不好实现。

 

再说说解题思路

使用一个变量,但需要表示两方的位置

首先想到的自然是一个变量当连个变量用,前后四个字节分开,注意是unsigned ,否则第一个为符号位

书上的第一种方法和第三中方法都是这样的

特别说一下 第三中方法

结构体里面的

unsigned char a:4;

unsigned char b:4;

表示位域,即a4位,b4位,

 

有了两个变量后自然就没什么问题了。

 

至于第二种方法的确相当精妙,直接使用一个变量放大9倍,也就有了两个变量的效果。

 

我自己也写了一个,其实差不多,都是当成两个变量用

 

#include<stdio.h>

int main()

{

    unsigned char i=17;

    for(;(i&0xf)<=9;i++)

       for(i=(i&0x0f)|0x10;(i>>4)<=9;i+=16)

                     if ((i & 0xf) % 3 != (i>> 4) % 3)

                     {

                            printf(“A=%d,B=%d\n”,(i & 0x0f), (i >> 4));

                     }

    return 0;

}

 

    原文作者:wejoncy
    原文地址: https://blog.csdn.net/wejoncy/article/details/43302729
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞