C语言讨论象棋将帅问题,代码短又美!昆仑| 話象棋 象棋残局(图1)

C语言讨论象棋将帅问题,代码短又美!昆仑| 話象棋 象棋残局(图2)

关于中国象棋将帅位置的简单问题,如下图所示,写一个程序输出将、帅的合法位置。

C语言讨论象棋将帅问题,代码短又美!昆仑| 話象棋 象棋残局(图3)

分享 • 世间美好|風景|人文|摄影|文学|視覚

C语言讨论象棋将帅问题,代码短又美!昆仑| 話象棋 象棋残局(图4)

C语言讨论象棋将帅问题,代码短又美!昆仑| 話象棋 象棋残局(图5)

C语言讨论象棋将帅问题,代码短又美!昆仑| 話象棋 象棋残局(图6)話象棋Table qing in Xining

作者|昆仑(青海)

分析与解法

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

C语言讨论象棋将帅问题,代码短又美!昆仑| 話象棋 象棋残局(图7)

楚河汉界争输赢,方寸之地狼烟浓。手谈棋枰无恩仇,莫以成败论英雄。
              

因此,需要存储的是A、B 的位置信息,并且每次循环都要更新。为了能够进行判断, 首先需要创建一个逻辑的坐标系统,以便检测 A 何时会面对 B。这里我们想到的方法是用 1~9的数字,按照行优先的顺序来表示每个格点的位置。这样,只需要用 模余运算就可以得到当前的列号,从而判断A、B 是否互斥。小编给大家推荐一个学习氛围超好的地方,C/C++交流企鹅裙:【 六二七,零一二,四六四 】适合在校大学生,小白,想转行,想通过这个找工作的加入。裙里有大量学习资料,有大神解答交流问题,每晚都有免费的直播课程


 将

驱卒策马过江东,运筹帷幄在中宫。将帅威严震四海,士佐相谋定乾坤。
             

C语言讨论象棋将帅问题,代码短又美!昆仑| 話象棋 象棋残局(图8)


 车

横冲直撞向前冲象棋残局,纵横八荒任尔通。睥睨天下仰天笑,直捣黄龙建奇功。
      

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


 炮

保疆戍边炮守中,隔山打牛显神通。海底捞月摄敌胆,背宫夺帅丧寇魂。
            


 马

昂首奋蹄怒分鬃,斜闯东西南北中。卧槽砥砺谋后动 ,挂角傲视欺中宫。
          

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


 卒

守土卫界行伍中,勇渡界河显威风。直逼中宫无退路,舍生忘死是为勇。
       

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


 相

贤相勋业务兵戎,七星阵寨护中宫。御敌防寇田野间,联手佐帅正军容。
          


 士

义士保驾留中宫,身在大营亦犯凶。若有强敌逼王帐,舍身取义来尽忠 。


注:图片来源于网络,如有侵权请联系平台删除!文作者简介:

C语言讨论象棋将帅问题,代码短又美!昆仑| 話象棋 象棋残局(图9)

那么:如何使用bit级的运算将数据从这一byte变量的左边和右边分别存入和读出呢?

大家容易想到的是对那个变量进行各种位运算,最后输出结果。但是其实C语言中还提供了一种存在于结构体中叫做位域的类型,因此程序就变得简单多了。

代码实现

C语言讨论象棋将帅问题,代码短又美!昆仑| 話象棋 象棋残局(图10)

C语言讨论象棋将帅问题,代码短又美!昆仑| 話象棋 象棋残局(图11)

▲昆仑· 

昆仑 原名马战盼,青海省德令哈市人。现居德令哈市河西街道清真巷。回族,生于1978年。初中毕业后一直在草原放牧牛羊,和都市生活不一样的生活体验培养出了独特的文化视角。因生活单调乏味,自幼酷爱文学的我开始尝试写作乡土诗歌。《西宁表情》微刊特约作家。C语言讨论象棋将帅问题,代码短又美!昆仑| 話象棋 象棋残局(图12)
西宁表情编审
副总编辑:冶丹枫 编辑:刘育彤  责编:冶晓辉 校审:波妞、艺心、无痕

C语言讨论象棋将帅问题,代码短又美!昆仑| 話象棋 象棋残局(图13)

欢迎广大作者投稿,摄影作品,游记,散文、小小说、诗歌均可。文责自负,自行校对。投稿时请附作者简介与需要配图的照片。西宁表情平台发布的均为原创作品,请勿一稿多投。

文学投稿 | 273629409@qq.com      摄影投稿 | 502836308@qq.com

西宁的表情带您了解全新青海

C语言讨论象棋将帅问题,代码短又美!昆仑| 話象棋 象棋残局(图14)

这样的代码又短又好看有没有?

C语言讨论象棋将帅问题,代码短又美!昆仑| 話象棋 象棋残局(图15)