《编程之美》读书笔记(一)——中国象棋将帅有效位置

《编程之美》读书笔记(一) ——中国象棋将帅有效位置

(原创内容,转载请注明来源,谢谢)

一、问题

如上述棋盘,假设将为点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=%d\n”, 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=%d\n”,i.a, i.b);
}
}
}

——written by linhxx 2017.10.04

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-10-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏一个会写诗的程序员的博客

React极简教程: Hello,World!React简史React安装Hello,World

A programming paradigm is a fundamental style of computer programming. There are...

721
来自专栏Python攻城狮

正则表达式1.正则表达式概述2.re模块操作3.表示字符4.re模块的高级用法5.贪婪和非贪婪

在Python中需要通过正则表达式对字符串进行匹配的时候,可以使用一个模块,名字为re

912
来自专栏Flutter入门

有趣的正则表达式

听到正则表达式,大家一定不会陌生。工作项目中也经常使用正则表达式来校验文本的是否匹配规则。通常都会直接上网找寻各种格式输入的正则匹配式。比如电话/邮件等等。

863
来自专栏Python攻城狮

Python数据科学(七)- 资料清理(Ⅱ)1.资料转换2.处理时间格式资料3.重塑资料4.学习正则表达式5.实例处理

注意:这里的时间转换后的格式可以根据需要设定,eg:dt.strftime('%Y/%m/%d')

963
来自专栏决胜机器学习

有趣的算法(九) ——蛇形数组

有趣的算法(九)——蛇形数组 (原创内容,转载请注明来源,谢谢) 一、问题阐述 给定一个数字,需要返回的内容如下图所示: 输入5,得到结果: ? 输入10,得到...

2849
来自专栏顶级程序员

MySQL 全文索引应用简明教程

本文从以下几个方面介绍下MySQL全文索引的基础知识: MySQL全文索引的几个注意事项 全文索引的语法 几种搜索类型的简介 几种搜索类型的实例 全文索引的几个...

37310
来自专栏进击的君君的前端之路

知识点梳理

802
来自专栏大史住在大前端

javascript基础修炼(2)——What's this(上)

this是javascript关键字之一,是javascript能够实现面向对象编程的核心概念。用得好能让代码优雅高端,风骚飘逸,用不好也绝对是坑人坑己利器。我...

611
来自专栏菜鸟前端工程师

JavaScript学习笔记013-正则表达式

331
来自专栏Play & Scala 技术分享

挑逗 Java 程序员的那些 Scala 绝技

有个问题一直困扰着 Scala 社区,为什么一些 Java 开发者将 Scala 捧到了天上,认为它是来自上帝之吻的完美语言;而另外一些 Java 开发者却对它...

1166

扫码关注云+社区