文档章节

1.2 中国象棋将帅的问题

奋斗到天明
 奋斗到天明
发布于 2015/08/27 17:55
字数 926
阅读 67
收藏 0
点赞 0
评论 0

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

 1 

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

请写出一个程序,输出A、B所有合法的位置,要求在代码中只能使用一个变量。 

我的理解:下过象棋的都知道,将帅只能在“宫”中,而且不能碰面。这个题目就是要算出将帅有多少种合法的摆法。

当然,这肯定得用到循环。所以第一步,将棋盘坐标有序化,将其可能的位置用数字代表:

  2 

这样就可以用两层循环+判断解决问题了,但是有个限制,只能程序中使用一个变量!Java中的for循环果断不能用啊!但是单用while也不好实现。 这里我考虑将第一层循环与第二层循环合并,这样就绕过这个问题咯。用一个两位数的十位与个位分别表示A与B,那么合并的循环就可以取99:上代码:

public static void section1(){
    int i = 99;
    while(i>10){
        if(i%10!=0){
            if((i/10 - 1)/3 != (i%10 - 1)/3){
                System.out.println( "a:" + (i/10)  + ",b:" + (i%10));
            }
        }
        i--;
    }
}

考虑好看,可以添加两个常量,表示位置,如下:

public static void  section2(){
    final String[] a = {"d10","d9","d8","e10","e9","e8","f10","f9","f8"};
    final String[] b = {"d3","d2","d1","e3","e2","e1","f3","f2","f1"};
    int i = 99;
    while(i>10){
        if(i%10!=0){
            if((i/10 - 1)/3 != (i%10 - 1)/3){
                System.out.println( "a:" + a[(i/10) -1] + ",b:" + b[(i%10) -1]);
            }
        }
        i--;
    }
}

当然也可以利用强制类型转换,直接在输出的字母,如下:

public static void  section3(){
    int i = 99;
    while(i>10){
        if(i%10!=0){
            if((i/10 - 1)/3 != (i%10 - 1)/3){
                System.out.println( "将:" + (char)((i/10 -1)/3 + 100) + ((i/10 -1)%3 + 8)  + ",帅:" + (char)((i%10 -1)/3 + 100) + ((i%10 -1)%3 + 1));
            }
        }
        i--;
    }
}

最终结果:

将:f10,帅:e3
将:f10,帅:e2
将:f10,帅:e1
将:f10,帅:d3
将:f10,帅:d2
将:f10,帅:d1
将:f9,帅:e3
将:f9,帅:e2
将:f9,帅:e1
将:f9,帅:d3
将:f9,帅:d2
将:f9,帅:d1
将:f8,帅:e3
将:f8,帅:e2
将:f8,帅:e1
将:f8,帅:d3
将:f8,帅:d2
将:f8,帅:d1
将:e10,帅:f3
将:e10,帅:f2
将:e10,帅:f1
将:e10,帅:d3
将:e10,帅:d2
将:e10,帅:d1
将:e9,帅:f3
将:e9,帅:f2
将:e9,帅:f1
将:e9,帅:d3
将:e9,帅:d2
将:e9,帅:d1
将:e8,帅:f3
将:e8,帅:f2
将:e8,帅:f1
将:e8,帅:d3
将:e8,帅:d2
将:e8,帅:d1
将:d10,帅:f3
将:d10,帅:f2
将:d10,帅:f1
将:d10,帅:e3
将:d10,帅:e2
将:d10,帅:e1
将:d9,帅:f3
将:d9,帅:f2
将:d9,帅:f1
将:d9,帅:e3
将:d9,帅:e2
将:d9,帅:e1
将:d8,帅:f3
将:d8,帅:f2
将:d8,帅:f1
将:d8,帅:e3
将:d8,帅:e2
将:d8,帅:e1

改进的地方:可以利用九进制减少循环的次数,改循环数为81,用除九的商表示A,除九的模表示B,《编程之美》书中,也有这种答案。用十进制是最先想到,也是最直观的方法。

© 著作权归作者所有

共有 人打赏支持
奋斗到天明
粉丝 18
博文 112
码字总数 82707
作品 0
昌平
程序员
中国象棋将帅问题

问题描述: 在中国象棋规则中,将和帅规定只能在田字格中移动,且将和帅是不能碰面的,请求解出所有可能的符合规则的将帅位置。 限制条件: 只能使用一个字节的变量 问题解答: 刚看到问题时...

姜宇 ⋅ 2012/05/17 ⋅ 0

Silverlight+WCF 新手实例 象棋 主界面-状态重置(三十四)

在线演示地址:Silverlight+WCF 新手实例 象棋 在线演示 正如我们在:Silverlight+WCF 新手实例 象棋 主界面-事件区-求和认输(三十二)里面提到的一样: “游戏结束了,要干点什么呢?当然就是...

晨曦之光 ⋅ 2012/03/09 ⋅ 0

中国象棋棋盘游戏开发库--libcnchess

libcnchess 是一个用于开发基于两个玩家的中国象棋棋盘游戏的库, 它的目标是提供灵活方便的功能让用户可以 不需要熟悉太多象棋规则即可开发出自己的象棋游戏 特性 提供解释符合中国象棋协会标...

红薯 ⋅ 2014/08/08 ⋅ 0

围棋界打败人类无敌手的AlphaGo咋就不来下下中国象棋?

  横空出世,横扫围棋界所有世界冠军,去年吊打韩国棋手李世石、今年元旦车轮战人类顶尖棋手,5月虐哭中国棋手柯洁的机器人AlphaGo,这两天又火了!         因为昨儿,AlphaGo的开发...

有趣的人工智能 ⋅ 2017/10/19 ⋅ 0

用VC6.0编得中国象棋无法运行

@红薯 你好,想跟你请教个问题:用VC6.0编得中国象棋无法运行,代码我已上传;如果你有时间你把具体实现的步骤告诉我行吗?谢谢了!

黑狼9 ⋅ 2012/11/07 ⋅ 2

中国象棋--GMChess

GMChess 是一款 Linux 下的中国象棋软件。 正值svn版本号100,发布GMChess的第一个版本0.10吧。目前只有读谱功能,支持qq象棋,联众象棋,中游象棋,象棋演播室等软件生成的棋谱。 使用方法:...

匿名 ⋅ 2009/03/26 ⋅ 1

发布一款基于silverFoxServer构建的一套象棋联机对战程序!

基于silverFoxServer构建的一套象棋联机对战程序 点进入或去旁观进入房间 整合到了discuz论坛,主要也是体现silverFoxServer的理念,即没有自已的数据库,依赖其它系统, 插件名称: Discuz中...

SilverFoxServer ⋅ 2015/09/09 ⋅ 3

HTML5代码做的中国象棋游戏,这个程序无人能敌

最近上班无聊时有事没事喜欢下几把象棋,当然前提是我项目都做得很好了,空闲时间才娱乐下,大家不要学我哟,玩了几把才知道,自己有好多年没练过了,游戏中的高手还是挺多的,毕竟这年代,还...

编程需要艺术 ⋅ 01/13 ⋅ 0

围棋人机大战:为什么AlphaGo不首先挑战中国棋手?(无责任猜测,不幸猜中不胜荣幸)

人机围棋大战 最近李世石出名了,阿尔法狗出名了,谷歌上头条了! 李世石虽然连输三盘,但第四盘扳回一局,第五局明天开战。期间国内各大棋手纷纷表示“不服”,要求挑战谷歌的这只狗狗,那么...

fireball1975 ⋅ 2016/03/14 ⋅ 0

IT增值服务,客户案例(一)--山东青岛在职人士,2年.Net经验,转Java开发半年

客户总体情况:2年.Net开发经验,2014年刚刚转Java半年。对Java的若干问题不是非常清楚,仅仅是对JSP/Servlet/JavaBean Spring、SpringMVC、Mybatis有点基础性的认识。 项目中就主要用到了上...

技术mix呢 ⋅ 2017/11/09 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Mahout推荐算法之SlopOne

一、 算法原理 有别于基于用户的协同过滤和基于item的协同过滤,SlopeOne采用简单的线性模型估计用户对item的评分。如下图,估计UserB对ItemJ的偏好 图(1) 在真实情况下,该方法有如下几个...

xiaomin0322 ⋅ 33分钟前 ⋅ 0

LVM讲解

LVM是什么 LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,Linux用户安装Linux操作系统时遇到的一个常见的难以决定的问题就是如何正确地...

李超小牛子 ⋅ 42分钟前 ⋅ 0

mysql更改密码、连接mysql、mysql常用命令

1. 更改mysql的root账户密码: mysql中root账户和系统root不是一个账户 1.1 更改环境变量PATH,增加mysql绝对路径 由于mysql安装目录为/usr/local/mysql/,所以系统不能直接使用mysql,需把/...

laoba ⋅ 43分钟前 ⋅ 0

阿里云发布企业数字化及上云外包平台服务:阿里云众包平台

摘要: 阿里云正式发布旗下众包平台业务(网址:https://zhongbao.aliyun.com/),支持包括:网站定制开发,APP、电商系统等软件开发,商标、商品LOGO、VI、产品包装设计、营销推广、大数据人...

猫耳m ⋅ 43分钟前 ⋅ 0

阿里云发布企业数字化及上云外包平台服务:阿里云众包平台

摘要: 阿里云正式发布旗下众包平台业务(网址:https://zhongbao.aliyun.com/),支持包括:网站定制开发,APP、电商系统等软件开发,商标、商品LOGO、VI、产品包装设计、营销推广、大数据人...

阿里云云栖社区 ⋅ 47分钟前 ⋅ 0

1.03-Maven中使用ueditor富文本编辑器

起因:在maven仓库未找到百度的ueditor的jar包 操作: 1.下载百度的ueditor的jar包 2.打开命令行,切换到ueditor的下载位置,运行一下命令: mvn install:install-file -Dfile=ueditor-1.1....

静以修身2025 ⋅ 52分钟前 ⋅ 0

几道Spring 面试题

1、BeanFactory 接口和 ApplicationContext 接口有什么区别? ApplicationContext 接口继承BeanFactory接口 Spring核心工厂是BeanFactory BeanFactory采取延迟加载,第一次getBean时才会初始...

职业搬砖20年 ⋅ 今天 ⋅ 0

包饺子

http://storage.slide.news.sina.com.cn/slidenews/77_ori/2018_24/74766_826131_625489.gif

霜叶情 ⋅ 今天 ⋅ 0

xml解析

方法一: String s_xml1 = "<xml>" + "<head>lalalalal</head>" + "<body>1234</body>" + "</xml>"; try { DocumentBuilderFactory documentBuilderFactory......

GithubXD ⋅ 今天 ⋅ 0

reuse stream

Although Java streams were designed to be operated only once, programmers still ask how to reuse a stream. From a simple web search, we can find many posts with this same issue ......

idoz ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部