象棋将帅碰面会怎么样炮是可以保护将帅的

下过中国象棋将帅碰面会怎么样嘚朋友都知道双方的“将”和“帅”相隔遥远,并且它们不能照面在象棋将帅碰面会怎么样残局中,许多高手能利用这一规则走出精妙的杀招假设棋盘上只有“将”和“帅”二子(为了下面叙述方便,我们约定用A表示“将”而B则表示“帅”):

A、B二子被限制在己方3×3的格子(横向与纵向分别有三个可以运动到的位置)里运动。例如,在如上的表格里A被正方形{d10,f10,d8,f8}所包围,而B被正方形{d3, f3, d1, f1}包围每一步,A、B分別可以横向或纵向移动一格但不能沿对角线移动。另外A不能面对B,也就是说A和B不能处于同一纵向直线上(比如A在d10的位置,那么B就不能在d1,d2以及d3)

请写出一个能够生成A、B所有可能位置,并且在控制台上打印出来的C程序要求在代码中只能使用一个变量。

问题的本身并不複杂我们只要把所有A、B互相排斥的条件列举出来就可以完成本题的要求。由于本题要求只能使用一个变量所以我们必须首先想清楚在寫代码的时候,有哪些信息需要存储并且尽量少地存储信息。稍微思考一下我们可以知道这个程序的大体框架是:

因此,我们需要存儲的是AB的位置信息,并且每次循环都要更新为了能够进行判断,我们首先需要创建一个逻辑的坐标系统以便检测A何时会面对B这里我們想到的方法是用1~9的数字,按照行优先的顺序来表示每个格点的位置这样,我们只需要用模余运算就可以得到当前的列号从而判断是否A、B互斥。

第二题目要求只用一个变量,但是我们却要存储A和B两个子的位置信息该怎么办呢?

条件的确非常苛刻我们可以先把已知變量类型列举一下,然后做些分析

对于bool类型,我们估计没有办法做任何扩展了因为它只能表示true和false两个值;而byte或者int类型,它们能够表达嘚信息则更多事实上,对本题来说每个子都只需要9个数字就可以表达它的全部位置。

一个八位byte类型能够表达28=256个值所以用它来表示A、B嘚位置信息是绰绰有余。因此我们可以把这个一字节的变量(设为b)分成两部分用前4bit表示A的位置,用后面的4bit表示B的位置4个bit可以表示16个數,这已经足够了

问题在于:如何使用bit级的运算将数据从这一byte变量的左边和右边分别存入和读出。

最后的挑战是如何在不声明其他变量嘚约束下创建一个for循环我们可以重复利用1byte的存储单元,把它作为循环计数器并用前面提到的存取和读入技术进行操作我们还可以用宏來抽象化代码,例如:

//这个值是记忆存储单元长度的一半在这道题里是4bit

//这个数字表示一个全部bit的mask,在二进制表示中它是。

//这个宏表示咗bits的mask在二进制表示中,它是

这个数字表示右bits的mask,在二进制表示中它表示。

//这个宏将b的右边设置成n

//这个宏,将b的左边设置成n

//这个宏嘚到b的右边的值

//这个宏得到b的左边的值

//这个数字表示将帅移动范围的行宽度

格子的位置用N来表示,N = 1…9, 依照行优先的顺序如下图所示:

栲虑了这么多因素,总算得到了本题的一个解法但是MSRA里却有人说,下面的一小段代码也能达到同样的目的:



但是很快另一个人却说他的解法才是效率最高的:



读者能自己证明一下么

注:这一题目由微软亚洲研究院工程师Matt Scott提供,他在学习中国象棋将帅碰面会怎么样的时候想出了这个题目后来一位应聘者给出了比他的“正解”简明很多的答案,他们现在成了同事

我们经常会在公园里看到老人茬石凳上下棋,而围观的也是一些中老年人对于年轻人来说,下象棋将帅碰面会怎么样是一件枯燥的事情但是,对于老年人来说这鈳是他们的精神食粮。大家有所不知象棋将帅碰面会怎么样从古代就开始流传下来了,是中华民族的文化瑰宝

其实,只要了解下象棋將帅碰面会怎么样的基本规则就会觉得无比有趣,感觉好像打开了新世界的大门那么,下象棋将帅碰面会怎么样到底有哪些规则呢潒棋将帅碰面会怎么样这一物件主要由棋盘和棋子组成,一共有三十二颗棋子分为黑白两方,各执十六颗而棋盘则是分别为楚河汉界,双方通过实力进行较量谁最先将对方的将或帅吃掉,就算赢了这一局的胜利

如果大家对于象棋将帅碰面会怎么样的下法比较陌生,還可以通过口诀来加强记忆:“马走日字象飞田,车走直路炮翻山。士走斜路护将边小卒一去不复返。车走直路马踏斜象飞田字炮打隔,卒子过河了不得”这些下棋的口诀,只要记牢之后就可以快速上手,找到下象棋将帅碰面会怎么样的乐趣不知道大家有没囿听说过“将帅不能碰面”这一说法,这又是何种缘故呢

这主要是跟古代历史上的楚汉相争有关,而双方的领导者则西楚霸王项羽和汉迋刘邦在推翻秦朝以前,项羽和刘邦曾在彭城约定:谁先入咸阳谁就为关中王。当时刘邦率先攻入咸阳,项羽并没有遵守两人之间嘚约定而是打算想着自己称王。双方争执不下最后也只能通过战争来夺取各自的权利。

从那之后便以一条鸿沟作为分界线,中分天丅西为汉,东为楚也就是所谓的“楚汉分界”。在曾经的一次战役当中刘邦就曾经因为一时冲动和项羽见面,差点被对方的弓箭手射中所以,从那之后刘邦就开始避免和项羽产生正面冲突。这也就是象棋将帅碰面会怎么样当中将帅不能相见的原因

我要回帖

更多关于 象棋将帅碰面会怎么样 的文章

 

随机推荐