编程之美-将帅问题

来源:互联网 发布:全球大数据公司排名 编辑:程序博客网 时间:2024/06/04 08:42

   编程之美也是本好书,今天早上看了将帅问题,太经典了,让我联想到了编程珠玑的第章,都是利用位来存储,来运算。  题目:把将帅符合要求的所有位置表示出来。  条件:只能使用一个8位的变量。  思路:对将帅两重循环所有位置,将%3相同的去掉,取剩下的位置。  本题主要侧重对于位运算的理解:位运算,位字段,位存储。  
#include <stdio.h>#define HALF_BITS_LENGTH 4#define FULLMASK 255 #define LMASK (FULLMASK<<HALF_BITS_LENGTH) #define RMASK (FULLMASK>>HALF_BITS_LENGTH)#define RSET(b,n) (b=((LMASK&b)|(n)))#define LSET(b,n) (b=((RMASK&b)|((n)<<HALF_BITS_LENGTH)))#define RGET(b) (RMASK&b)#define LGET(b) ((LMASK&b)>>HALF_BITS_LENGTH)#define GRIDW 3//使用位段struct {unsigned char a:4;unsigned char b:4;}i;int main(){//位段输出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\n",i.a,i.b);//如果j=81到73,j/9:表示商为8//j%9:对应的余数取1到9//也即是每一个商对应9个余数,类似与两重遍历char j=81;while(j--){if(j/9 %3 == j%9 %3)continue;//printf("A=%d,B=%d\n",j/9+1,j%9+1);}//最基本的两重循环,将符合条件的输出unsigned char b;for(LSET(b,1);LGET(b)<=GRIDW * GRIDW;LSET(b,(LGET(b)+1)))for(RSET(b,1);RGET(b)<=GRIDW * GRIDW;RSET(b,(RGET(b)+1)))if(LGET(b)%GRIDW!=RGET(b)%GRIDW)//printf("A=%d,B=%d\n",LGET(b),RGET(b));return 0;}


原创粉丝点击