编程之美之中国象棋问题
2013-10-24 12:36
211 查看
一、题目原型
下过中国象棋的朋友都知道,双方的“将”和“帅”相隔遥远,并且它们不能照面。在象棋残局中,许多高手能利用这一规则走出精妙的杀招。假设棋盘上只有“将”和“帅”二子(如图 1-3所示)为了下面叙述方便,我们约定用 A表示“将”,B表示“帅”,那么A和B的运动将被限制在己方的3X3的格子中,A、B可以横向或者纵向移动一格,但是不能沿对角线移动。当A、B处于一条直线上时,棋局结束。换言之,A、B不能在一条直线上,请编写一个程序输出A、B的所有可能位置。
二、数学抽象
这个问题的大致思路是遍历每个A、B可能出现的位置,然后组合、判断,如果条件满足就输出。基于这个思路,我们发现A、B的位置都可以用这9个数字来描述。那么怎么判断这两个点是否在一条线上呢? 仔细研究之后,我们发现可以用求余来解决,于是程序的代码就出来了:
呵呵,第一篇《编程之美》的文章就这样愉快的开始吧!
下过中国象棋的朋友都知道,双方的“将”和“帅”相隔遥远,并且它们不能照面。在象棋残局中,许多高手能利用这一规则走出精妙的杀招。假设棋盘上只有“将”和“帅”二子(如图 1-3所示)为了下面叙述方便,我们约定用 A表示“将”,B表示“帅”,那么A和B的运动将被限制在己方的3X3的格子中,A、B可以横向或者纵向移动一格,但是不能沿对角线移动。当A、B处于一条直线上时,棋局结束。换言之,A、B不能在一条直线上,请编写一个程序输出A、B的所有可能位置。
二、数学抽象
这个问题的大致思路是遍历每个A、B可能出现的位置,然后组合、判断,如果条件满足就输出。基于这个思路,我们发现A、B的位置都可以用这9个数字来描述。那么怎么判断这两个点是否在一条线上呢? 仔细研究之后,我们发现可以用求余来解决,于是程序的代码就出来了:
for (int i = 1; i <= 9; i++) { for (int j = 1; j <= 9; j++) { if (i % 3 != j % 3) { Console.WriteLine("A Possible Combination is" + "(" + i + "," + j + ")"); } } }
呵呵,第一篇《编程之美》的文章就这样愉快的开始吧!
相关文章推荐
- JAVA 文件拖拽
- PHP POST数组有上限? max_input_vars!
- 什么时候使用接口?什么时候使用抽象?选择Java接口还是抽象类
- java创建数组的三种方法
- 开源项目-基于spring
- ADO在C++中的使用
- 用VB快速读取TextBox第N行的数据
- C语言实现累加和累乘
- delphi学习路线
- Kata代码,程序猿的练习课程
- VC多线程编程实例
- phpcms template函数分析
- VC++多线程编程
- phpcms 模块开发(二)
- C/C++定义全局变量/常量几种方法的区别
- struts2 文件下载中文乱码问题解决方案
- 谈谈我是怎么学会python的
- 简化Java日期操作的开源项目DATE4J
- phpcms 模块开发(一)
- Eclipse调试常用技巧