编程之美之中国象棋将帅问题
来源:互联网 发布:twemproxy源码分析 编辑:程序博客网 时间:2024/05/01 01:24
一、面试题与acm题目的区别。
这几天在看面试题目,与以前做acm的题目有不同的感觉。从题目题材上说acm由于不同客户机的系统等有差异,所以一般都会选择通用性的算法很少涉及本地的API之类的东西,同时acm很少对代码内容做限制,更多的是要求时间复杂度和空间复杂度。而面试题目是在专用机器上做的,同时没有标准化的输入输出,只要你能跑通即可,但是面试官可以对你的代码做更多的要求,比如说只用一个变量,不能用库函数,用某种系统的底层API等。这些使得平时我们的面试与acm有较大的差别,我看了leetcode上面的题目感觉跟面试题目的口味有点像,不过不知道他们是怎么判正误的,感觉是个不错的平台。
二、位操作与宏定义设置数据结构法
下面的做法是把一个char变量(8位)分成上四位和下四位,上四位表示A的位置,下四位表示B的位置,明显发现这里的输出都是用户自定义的,在面试的时候没有要求输出,只需提供合理的一种思路即可。
#include <stdio.h>#define HALF_BITS_LENGTH 4//这个值是记忆存储单元长度的一般,在这道题里是4bit;#define FULLMASK 255//这个数字表示一个全部bit的mask,在二进制表示中,它是11111111#define LMASK (FULLMASK<<HALF_BITS_LENGTH)//这个宏表示一个左bit的mask,在二进制表示中,它是11110000、//用宏的时候如果里面有运算符,记得加括号#define RMASK (FULLMASK>>HALF_BITS_LENGTH)//这个宏表示一个左bit的mask,在二进制表示中,它是00001111、#define RSET(b,n) (b=((LMASK&b)^n))//这个宏将b的右边设置成n;#define LSET(b,n) (b=((RMASK&b)^(n<<HALF_BITS_LENGTH)))//这个宏,将b的左边设置成n;#define RGET(b) (RMASK&b)//这个宏得到b右边的值;#define LGET(b) ((LMASK&b)>>HALF_BITS_LENGTH)//这个宏得到b左边的值;#define GRIDW 3//grid的宽度,//以上的作为给我们封装数据结构提供了另外一种思路——使用宏定义//以上的宏定义设置了一个数据结构,这个数据结构的变量为一个BITE,//操作为对左半部分赋值和右半部分赋值,以及分别获得左右两部分的值;//这里用了抽象和分层设计其中RSET LSET RGET LGET GRIDW直接作为应用宏供调用//LMASK RMASK 为抽象出来的第二层宏,FULLMASK和HASL_BITS_LENGTH 为底层调用。//这个设计思路肯定是自上向下的,而不是自下向上。 int main(){ unsigned char b;//使用unsigned可以获取一个8位数字; 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;}
三、数学拆分法
posA*9+posB取遍(0-80) 并且每对位置与唯一的一个值一一对应,这个是个很重要的思路,把两个值的关系映射到一个坐标轴上。
C语言中可以使用unsigned char 来表示一个字节的整数,所以char型本质上也是整数类型。看吧,这里是倒序输出了数据对 依然没有什么大碍。
#include <stdio.h>int main(){ unsigned char b = 81; while(b--) { if(b/9%3!=b%9%3) printf("A=%d,B=%d\n",b/9%3+1,b%9%3+1); } return 0;}
四、字节拆分法
这里使用了结构体共用字节的特点。
#include <stdio.h> int main(){ 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\n",i.a,i.b); //printf("A:%c%d B:%c%d\n",'d'+i/3,i%3+1); } return 0;}
0 0
- <<编程之美>>之中国象棋将帅问题
- 编程之美之中国象棋将帅问题
- 编程之美之中国象棋将帅问题
- 编程之美 - 中国象棋将帅问题
- 编程之美 - 读书笔记 - 中国象棋将帅问题
- 编程之美:中国象棋将帅问题
- 微软编程之美--中国象棋将帅问题
- 编程之美-中国象棋将帅问题
- 编程之美_002中国象棋将帅问题
- 编程之美-中国象棋将帅问题
- 编程之美---中国象棋将帅问题
- 编程之美二 : 中国象棋将帅问题
- 编程之美 -- 中国象棋将帅问题
- 编程之美 1.2 中国象棋将帅问题
- 编程之美1.2 中国象棋将帅问题
- 编程之美-中国象棋将帅问题
- 编程之美 1.2 中国象棋将帅问题
- 编程之美:中国象棋将帅问题
- windows下nginx日志分割
- 话说ValueMap的一般使用
- dalvik核心数据结构
- 项目总结 :木门app(2015.4.10 —— 2015.5.8)
- IE的layout属性详解
- 编程之美之中国象棋将帅问题
- 快速排序
- 在线学习网站
- 合并两个数组
- 替换空格
- 二维数组作为参数传递
- C++知识点
- C#学习笔记一
- 卷积的意义