编程之美二 : 中国象棋将帅问题
来源:互联网 发布:花生壳教学软件 编辑:程序博客网 时间:2024/04/30 19:29
中国象棋中,将帅相隔遥远,并且不能照面,假设棋盘上只有将和帅两字,如下图所示(A表示将,B表示帅):A、B二子被限制在己方3 x 3的格子里运动,每一步,A、b分别可以横向或纵向移动一格,但不能沿对角线移动。另外,A不能面对B,也就是说,A和B不能处于同一纵向直线上,请写出一个程序,输出A、B所有合法的位置。要求代码中只能使用一个字节存储变量。
我们的常规思路是这样的:
- - 循环A的位置
- - - - 循环B的位置
- - - - - - 判断A、B的位置是否满足要求
- - - - - - - - 如果满足,则输出。
// 一般的程序员会这么干:(但这里使用了2个变量)public class ChineseChess1 {public static void main(String[] args) {for (int i = 1; i <= 9; i++) {for (int j = 1; j <= 9; j++) {if (i % 3 != j % 3){System.out.println("a=" + i + ",b=" + j);}}}}}
难点: 只能使用一个字节存储变量
// 经典解法java实现:public class ChineseChess2 {public static void main(String[] args) {int i = 81;while (i-- != 0) {if (i / 9 % 3 == i % 9 % 3)continue;System.out.println("A=" + (i / 9 + 1) + " B=" + (i % 9 + 1));}}}// %3 正好是上面提到的 A 和 B 格子对应的数字 mod3 判断是否相等,相等则在一条直线上( A 和 B 碰面)。
上面的解法体现了程序的简约之美,可是让我这菜鸟程序员看的稀里糊涂: i / 9 % 3 == i % 9 % 3 是什么意思呢?
我们可以通过一个测试程序得到答案:
public class ChineseChess3 {public static void main(String[] args) {int i = 81;while (i-- > 0) {System.out.print(" " + i / 9); // 相当于双层循环的外层循环,值循环了9次再改变}int j = 81;System.out.println();while (j-- > 0) {System.out.print(" " + j % 9); // 相当于双层循环的内层循环,值循环依次改变9次}}}输出结果:
8 8 8 8 8 8 8 8 8 7 7 7 7 7 7 7 7 7 6 6 6 6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
8 7 6 5 4 3 2 1 0 8 7 6 5 4 3 2 1 0 8 7 6 5 4 3 2 1 0 8 7 6 5 4 3 2 1 0 8 7 6 5 4 3 2 1 0 8 7 6 5 4 3 2 1 0 8 7 6 5 4 3 2 1 0 8 7 6 5 4 3 2 1 0 8 7 6 5 4 3 2 1 0
通过上面的例子,同样是可以解决问题,但解法上的优劣一目了然,算法真的是一门博大精深的学问,值得我们每个程序员去细细品味!
- 编程之美二 : 中国象棋将帅问题
- 编程之美二 : 中国象棋将帅问题
- 《编程之美》读书随笔之二:中国象棋将帅问题
- 编程之美学习笔记(二):中国象棋将帅问题
- 编程之美:中国象棋将帅问题解法二
- <<编程之美>>之中国象棋将帅问题
- 编程之美之中国象棋将帅问题
- 编程之美之中国象棋将帅问题
- 编程之美 - 中国象棋将帅问题
- 编程之美 - 读书笔记 - 中国象棋将帅问题
- 编程之美:中国象棋将帅问题
- 微软编程之美--中国象棋将帅问题
- 编程之美-中国象棋将帅问题
- 编程之美_002中国象棋将帅问题
- 编程之美-中国象棋将帅问题
- 编程之美---中国象棋将帅问题
- 编程之美 -- 中国象棋将帅问题
- 编程之美 1.2 中国象棋将帅问题
- 高精度运算类bign
- 阅读文献的三大问题:坐不住,记不住,想不开
- android客户端从服务器端获取json数据并解析
- 一个非计算机专业的的毕业生在互联网行业的辉煌的求职之路,值得学习
- Java多线程之信号量(一)
- 编程之美二 : 中国象棋将帅问题
- 从12306说起,如何构建高并发高性能网站
- 黑马程序员 java-test
- 安装 VMware Tools 详解
- C# using 三种使用方式
- 读写文件统计符合要求的四位数
- POJ 1226 Substrings(strstr)
- volatile关键字
- 值得收集的几张ASCII码图片——ASCII picture is worth to collect