最近在看编程之美,颇有感触。
我把在第二章的一些想法思路写下来。
非常感谢刘未鹏,看了他的博客也让我坚定了写一些东西的决心,经过自己思考的东西都有价值,至少对自己哟价值,写的东西可能上不了台面,事实上不管你有多厉害,总会有比你更厉害的人。敢写出来也比不敢写出来好。
题目是这样的,只使用一个变量把两边的“帅”,”将”的所有可能的位置输出。
都知道 帅 将 不能在一条直线上,也就是不能面对面,把位置编号 1 2 3.。。。。9,共9个位置,再来分析,位置之间的关联性
如果A在1 那么B不能在 1 4 7 这三个位置。其他的同理。
数字之间的关系就是
用Wa表示A的位置,Wb表示B的位置
有Wa%3 == Wb%3
这里就是第一种方法,我称之为逆向思维,找出不可能的位置,书上的3中方法中都是逆向思维。
还有第二种方法 自然就是正向思维了
直接找出可能存在的位置
不过在本题中不好实现。
再说说解题思路
使用一个变量,但需要表示两方的位置
首先想到的自然是一个变量当连个变量用,前后四个字节分开,注意是unsigned ,否则第一个为符号位
书上的第一种方法和第三中方法都是这样的
特别说一下 第三中方法
结构体里面的
unsigned char a:4;
unsigned char b:4;
表示位域,即a占4位,b占4位,
有了两个变量后自然就没什么问题了。
至于第二种方法的确相当精妙,直接使用一个变量放大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;
}