博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【编程之美】中国象棋将帅问题
阅读量:6599 次
发布时间:2019-06-24

本文共 1247 字,大约阅读时间需要 4 分钟。

1 题目

  下过中国象棋的朋友都知道,双方的“将”和“帅”相隔遥远,并且它们不能照面。在象棋

残局中,许多高手能利用这一规则走出精妙的杀招。假设棋盘上只有“将”和“帅”二子
(为了下面叙述方便,我们约定用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 所有合法位置。要求在代码中只能使用一个变量。

2 代码

#include 
#include
using namespace std;#define LEFT (255<<4)#define RIGHT (255>>4)#define LGET(a) ((a & LEFT)>>4)#define RGET(a) (a & RIGHT)#define LSET(a, b) (a = ((a & RIGHT) ^ (b<<4)))#define RSET(a, b) (a = ((a & LEFT) ^ b))/* * 把一个八们的unsigned char c的前4位和后4位当作两个数来使用。0-255足够使用了。 * 其中LEFT为0x00001111,RIGHT为0x11110000. * RGET(a) 通过a与RIGHT取&操作来实现取a低4位值。LGET通过a与LEFT取&并右移4位来实现取a高4位值。 * LSET(a, b)把a的低4位设置为b。RSET(a, b)把a的高4位设置为b。 */void solution1(){ unsigned char c; for(LSET(c, 1); LGET(c)<=9; LSET(c, LGET(c)+1)) for(RSET(c, 1); RGET(c)<=9; RSET(c, RGET(c)+1)) if(LGET(c)%3 != RGET(c)%3) cout<<"A:="<
<<" B:="<
<

Author: visaya fan 

Date: 2011-08-24 00:15:54

HTML generated by org-mode 6.33x in emacs 23

转载地址:http://qolio.baihongyu.com/

你可能感兴趣的文章
Mac终端配置,DIY你的Terminal (iTerm 2 + Oh My Zsh)
查看>>
2017级寒假讲座二分三分训练题A - Cable master (浮点数二分法将其转化成整数进行)...
查看>>
angularjs申明$scope.xx = function()是有顺序的,而js是无块级作用域的
查看>>
Promise的简单实现
查看>>
项目开发遇到的一些问题
查看>>
《SVG精髓》笔记(二)
查看>>
Node.js Stream中Readable类的内部实现
查看>>
Java四类八种基本数据类型
查看>>
MYSQL事件
查看>>
【363天】跃迁之路——程序员高效学习方法论探索系列(实验阶段121-2018.02.03)...
查看>>
漫画:程序员,你能“管理”好你的产品经理吗?
查看>>
async/await 更好的异步解决方案
查看>>
入门机器学习,看这些材料就够了
查看>>
Spring 学习笔记(三)Spring MVC
查看>>
使用cmd命令行修复win7系统破坏区域
查看>>
Python线程池源码分析
查看>>
JS学习数组Array方法集合
查看>>
初识 “HTML”
查看>>
面向亿万级用户的QQ一般做什么?——兴趣部落的Web同构直出分享
查看>>
2017-10-11 前端日报
查看>>