《编程之美》读书笔记(一)——中国象棋将帅有效位置
《编程之美》读书笔记(一) ——中国象棋将帅有效位置
(原创内容,转载请注明来源,谢谢)
一、问题
如上述棋盘,假设将为点A,帅为点B。将只能在d10、d8、f10、f8点内部的正方形移动(共9个点 可以移动),帅假设点B只能在d3、d1、f3、f1的正方形移动,类似将。
现要求A、B不能在同一直线,求出A、B的所有合法位置,只能用一个变量。
二、分析
1、问题简化
首先,用1-9的九宫格位置,存储A、B点的位置,如下图:
则,每个数字对3取模,就可以确定所在的列,即可以确定A、B两点是否在同一列。
2、只能用一个变量
只能用一个变量,但是需要遍历A、B的位置,需要两个变量来存储数据,而且希望尽量节省空间。
三、求解
1、个人解法
看了书上第一种解法,一堆的位运算感觉很复杂。个人想到的是,既然要输出A、B两点的位置,其实可以用11-99中的数字,除去逢10的(即未定义的数字)以及同一列的数据,就可以得到想要的结果,而且只要用一个变量。
用PHP写法如下:
for($i=11;$i<100;$i++){
if(0 == $i%10 || $i%10%3 == intval($i/10)%3) continue;
echo “A=”.$i%10.” B=”.intval($i/10).”n”;
}
用java写法如下:
for(inti=11;i<100;i++){
if(0 == i%10 || int(i%10)%3 == (int)(i/10)%3) continue;
System.out.println(“A=”+i%10+” B=”+(int)(i/10));
}
2、书中解法二(解法一位运算太复杂忽略)
C++的写法,如下:
BYTEi = 81;
while(i--){
if(i/9%3 == i%9%3) continue;
printf(“A=%d, B=%dn”, i/9+1, i%9+1);
}
我发现这种解法比我的少了一重的判断,这个算法还是利用了1-9这9个数字,比我减少的是对于是否是0的判断。
经过计算,我发现确实这样筛选已经可以筛掉包含0的情况。
另外,结果输出的时候,采用和9计算后加1,这样可以在结果中返回所需的11-99中正确的数字。因为其从81开始,进入循环就减1了,因此除以9最多是8,和取模的结果范围一样,都是0-8,则加1就可以获取1-9。
3、书中解法三
解法三,个人认为已经超出只能用1个变量这个要求了,但是作者说这个效率更高,代码如下:
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=%dn”,i.a, i.b);
}
}
}
——written by linhxx 2017.10.04
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- socket方式传输文件
- 《重构-代码整洁之道TypeScript版》第2天
- 堆积柱形图(stacked barplot)展示密码子偏向性的RSCU值
- 《重构-代码整洁之道TypeScript版》第一天
- Hive小知识之分桶抽样
- CountDownLatch类在性能测试中应用
- 算法集锦(20) | 自动驾驶 | 交通标志识别算法
- 敏捷回归测试
- 算法集锦(21) | 自动驾驶 |汽车转向角控制算法
- Java压缩/解压缩字符串
- 凉经算法题反思 | 单调栈与DP二分法
- 终于有人把Docker讲清楚了!
- 飞天茅台超卖事故:Redis分布式锁请慎用!
- 算法集锦(24) | 自动驾驶 |高速公路行驶路径规划算法
- 【自动驾驶专题】|小白都会玩的自动驾驶算法