`
周凡杨
  • 浏览: 234191 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

《编程之美》--中国象棋将帅问题

阅读更多

最近在看微软研究院出版的《编程之美》一书,对于该书中提到的一些问题,特别感觉兴趣,比如下面这个问题:


 

分析:

思考一下,可以这样来解决,

------------------------------------------------------------------------------------------------------------------

遍历 A 的位置

  遍历 B 的位置

      判断 A B 的位置组合是否满足要求

      如果满足,则输出

------------------------------------------------------------------------------------------------------------------

类似于双层循环运算

 

创建一个逻辑坐标系统,用 1-9 的数字,按照行优先的顺序来表示每个格点的位置。


要证明 A B 不在同一列上,只要 A B 所处的格子点数 mod3 不相等就可以。

 

分析解法一:

该书中提到的解法一的思想是通过位运算来解决上面的问题。一个 8 位的 byte 类型能够表达 2 8 次方 =256 个值,所以用它来表示 A B 的位置信息绰绰有余,因此可以把这个字节分成两部分,用前面的 4bit 表示 A 的位置,用后面的 4bit 表示 B 的位置,而 4 bit 可以表示 16 个数,这已经够了。

    JAVA 中用 byte 来表示位置,可以实现,但只用一个变量,就没了思路(请高手指点)

 

分析解法二 ( 这里用 Java 代码实现 )

   

       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));

       }

   代码精简,但 i/9%3 == i%9%3 一句百思不得其解,原理是什么?

 

 

 

   想要弄懂 i/9 i%9 while 循环里代表什么意思,于是做了以下测试

 

       int i = 81;

       while(i-->0){

           System.out.print(" "+i%9);

       }

       i = 81;

       System.out.println();

       while(i-->0){

           System.out.print(" "+i/9);

       }
 

---------------------------------------------------------------------------------------------------------------------------------

输出结果:

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

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

 

从上面可以看出来, i/9 类似于双层循环的外层循环,保持值不变,直到内层循环循环了 9 次后,值再改变。而 i%9 正好类似于内层循环,值循环依次改变 9 次。

后面都带有 %3 正好是上面提到的 A B 格子对应的数字 mod3 判断是否相等,相等则在一条直线上( A B 碰面)。

 

 

分析解法三:

文中用到了 C 语言的 struct 结构, Java 中没有 struct 语法,可以用类对象形式实现,但就不是声明一个变量,解法中就要声明一个对象。

 

下面提供一个简易理解的解法:

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);

           }

}
 

 

虽然运用了两个变量,但清楚的表达了解题思想

 

   

也许用“大道至简”最能表达编程之美提倡的编程精神 但又不足以表达它的精神 编程需要有清楚的逻辑思维,数据结构等算法,有时候还要对计算机的底层指令及运行原理有一定的认,慢慢的发现,自己原在大学没有好好学的,工作中还要重拾起来

 

 

 

参考资料:

http://blog.csdn.net/softwareren/article/details/3921222

http://www.360doc.com/content/12/0326/20/8065943_198050580.shtml

  • 大小: 133.7 KB
  • 大小: 23.9 KB
0
3
分享到:
评论

相关推荐

    象棋将帅问题-编程之美

    在本项目中,我们主要探讨的是“象棋将帅问题”,这是编程领域中一个有趣的算法挑战,它结合了中国的传统棋类游戏——象棋的规则与C++编程语言。通过这个项目,我们可以深入理解对象导向编程(OOP)以及如何用高效的...

    华为oj编美象棋将帅

    在华为的在线编程训练平台OJ(Online Judge)上,有一类高级题目是关于象棋游戏的算法实现,其中“华为oj编美象棋将帅”是一个典型的编程挑战。这个题目要求开发者用Java语言来编写程序,模拟中国象棋中的将(帅)的...

    中国象棋将帅问题的算法和实现

    总的来说,解决中国象棋将帅问题的算法和实现涉及到了基础的数据结构、算法设计、面向对象编程以及游戏规则的理解。通过VC++这样的编程工具,我们可以将这些理论知识转化为实际的软件应用,使得玩家可以通过计算机...

    python pygame 中国象棋

    在这个场景中,我们讨论的是使用Pygame构建一个中国象棋游戏。中国象棋是一种深受中国人民喜爱的传统策略棋类游戏,规则复杂且富有深度。 在Python Pygame中开发中国象棋,首先需要理解游戏的基本规则和棋子的移动...

    手写小游戏 python游戏源码-11 中国象棋

    在本资源中,我们主要探讨的是使用Python编程语言编写的中国象棋小游戏。这是一个非常实用的学习项目,适合初学者理解Python编程以及游戏开发的基本概念。通过分析和学习这个游戏的源码,你可以掌握如何利用Python来...

    20164206004-刘继强-任务计划2-中国象棋-201706221

    综上所述,这个项目涵盖了时间管理、棋盘初始化、图形用户界面编程、游戏逻辑设计以及事件处理等核心知识点,是构建一个中国象棋游戏的基础。开发者需要理解并熟练掌握这些技能,才能完成一个完整的游戏程序。

    中国象棋C#版

    【中国象棋C#版】是一款使用C#编程语言开发的Windows桌面应用程序,它基于WinForms框架构建。这款游戏提供了一个平台,让用户可以体验到中国象棋的传统魅力,但不包含自动对弈的人工智能功能,意味着玩家需要与其他...

    C++写的中国象棋程序(附源代码)

    C++实现的中国象棋程序展示了如何利用面向对象编程的思想来解决问题。通过对棋盘、棋子、规则的抽象和封装,程序员能够构建出一个功能完备、运行稳定的象棋游戏。这种实践不仅有助于提升编程技能,也是理解和应用...

    Java开发的中国象棋

    《Java开发的中国象棋》是一款基于J2SE平台构建的桌面游戏,它融合了中国的传统智慧与现代编程技术,让玩家在享受游戏乐趣的同时,体验到编程的魅力。这款象棋游戏的核心在于其规则的实现和人机交互的设计,下面我们...

    中国象棋.zip

    《中国象棋——Java编程实现解析》 中国象棋,作为我国传统棋类游戏的瑰宝,历史悠久,深受人们喜爱。随着计算机技术的发展,越来越多的传统游戏被编程语言所复现,其中Java作为一种广泛应用于各领域的高级编程语言...

    VC实现的中国象棋游戏

    《VC实现的中国象棋游戏》是一款基于Visual C++编程环境开发的中国象棋游戏,其核心亮点在于采用置换表(Transposition Table)与alpha-beta剪枝技术来优化博弈树的搜索过程,以实现人机对弈的功能。下面将详细阐述...

    中国象棋脚本

    中国象棋,作为深受中国人民喜爱的传统棋类游戏,其规则严谨、策略性强,而“中国象棋脚本”则是将这种游戏逻辑转化为编程语言的一种实现。在这个场景中,标签为“java”,意味着我们讨论的是使用Java语言编写的中国...

    中国象棋vc源代码,一个基本的象棋程序,里面还有一些地方需要改进

    2. **游戏逻辑**:中国象棋的规则复杂,包括各种特殊移动(如“过河”、“士象不同行”、“将帅不照面”等)、吃子规则、将军和应将等。编写游戏逻辑是程序的核心部分,需要确保准确无误。 3. **用户交互**:程序...

    中国象棋源代码(VC开发)

    【中国象棋源代码(VC开发)...通过学习和分析这个中国象棋源代码,开发者不仅可以掌握C++编程技能,还能了解到如何在Windows平台上构建图形用户界面,以及实现复杂逻辑的算法,同时还能锻炼到项目管理和团队合作的能力。

    中国象棋C++

    【中国象棋C++】是基于C++编程语言实现的一款模拟中国传统棋类游戏——中国象棋的项目。在这个项目中,开发者用C++语言构建了象棋的基本规则、棋子移动逻辑以及用户交互界面,旨在提供一个可玩性强、规则准确的象棋...

    java版中国象棋(人机对战)

    中国象棋有着独特的规则和策略,包括棋子的移动方式、吃子规则、将帅不照面等。在项目中,这些规则被转化为可执行的代码,使得计算机能够理解和执行。开发者需要深入理解象棋规则,并能将其精确地表达为编程逻辑。 ...

    基于Android实现的中国象棋的程序源码.zip

    《基于Android实现的中国象棋程序源码解析》 在移动设备上开发游戏已经成为现代软件开发的重要领域,尤其是在Android平台上,其开源特性和广泛的设备覆盖为开发者提供了广阔的空间。本项目“基于Android实现的中国...

    C语言中国象棋

    总的来说,C语言实现中国象棋是一个结合了数据结构、算法和基本界面交互的项目,对于学习者来说,既能加深对C语言的理解,也能提升问题解决和编程思维能力。通过这个项目,你可以了解到如何用程序模拟现实世界的问题...

    象棋ai算法Alpha-Beta

    在中国象棋游戏开发中,AI(Artificial Intelligence)的设计至关重要,因为它决定了计算机对手的智能水平。本项目采用C++编程语言实现了一个具有较高智能的单机AI,它采用了经典的Alpha-Beta剪枝算法来优化搜索策略...

Global site tag (gtag.js) - Google Analytics