专栏首页决胜机器学习《编程之美》读书笔记(一)——中国象棋将帅有效位置

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

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

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

一、问题

如上述棋盘,假设将为点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),作者:linhxx

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

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

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

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Redis专题(二)——Redis数据类型(1)

    Redis专题(二)——Redis数据类型(1) (原创内容,转载请注明来源,谢谢) 一、概述 Redis是一种Key-Value类型的数据...

    用户1327360
  • Redis专题(九)——Redis管理工具

    Redis专题(八) ——Redis管理工具 (原创内容,转载请注明来源,谢谢) 一、安全性 1、运行环境 Redis以简洁为美,其安全性...

    用户1327360
  • 《Redis设计与实现》读书笔记(三十二) ——Redis事务设计与实现

    《Redis设计与实现》读书笔记(三十二) ——Redis事务设计与实现 (原创内容,转载请注明来源,谢谢) 一、概述 redis的事务同数据...

    用户1327360
  • 每日一刷:回文数

    判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

    乐心湖
  • Python编程常见出错信息及原因分析(4)

    (1)删除列表元素引起的下标变化错误 演示代码: x = list(range(10)) for i in range(len(x)): if x[i]%2 ...

    Python小屋屋主
  • python生成1-10以内的随机不相同的10个数字

    生成10个随机数很简单,循环10次,循环里面每次获取一次1-10范围内的一个随机数。可是结果,出现了相同的数字,不符合我们的要求。

    用户7054460
  • CV预备(一): conv2, filter2, imfilter的差别

    SeanDepp
  • 带毫秒的字符转换成时间(DateTime)格式的通用方法

    C#自身有更好的方式,Net任意String格式转换为DateTime类型 =========================================...

    Java中文社群_老王
  • 小朋友学C语言(15):“变量==常量”与“常量==变量”的区别

    (一)编写程序 #include <stdio.h> int main() { int x = 10; if(x == 10) { ...

    海天一树
  • 【算法专栏】整数中1出现的次数

    求出 1~13的整数中1出现的次数,并算出 100~1300的整数中1出现的次数?为此他特别数了一下 1~13中包含1的数字有 1、10、11、12、13因此共...

    ConardLi

扫码关注云+社区

领取腾讯云代金券