中国象棋将帅问题java_编程之美:中国象棋将帅问题

本文介绍了如何用Java解决《编程之美》中的中国象棋将帅问题。通过只使用一个变量,作者实现了一个程序,计算并输出在3x3格子内,将帅所有合法的位置组合。代码中,通过nNum表示A、B位置,通过判断nNum的余数确定位置合法性。最终,程序按题目要求的格式输出了合法的将帅位置。
摘要由CSDN通过智能技术生成

Author: Fox

晚上没有加班,打游戏打到9点过,后面就又看了一道《编程之美》的题目《中国象棋将帅问题》。

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

image003.jpg

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所有合法位置。要求在代码中只能使用一个变量。

在纸上画了半天,Soft从台湾给带的长寿都让我抽完了,总算对得起这会儿工夫……

我的思路大致如下:

1) 只能使用一个变量nNum ==> 只能使用一个循环,nNum只能用来表示A、B位置的组合,nNum最大为9×9-1=80;

2) 如何用nNum表示一个A、B位置的组合?

下图表示A(红色)、B(蓝色)所在位置:

6

7

8

3

4

5

0

1

2

6

7

8

3

4

5

0

1

2

以nNum%9表示A的位置,nNum/9表示B的位置,如nNum==15,A==6,B==1。

3) 如何确定A、B位置的合法性?

规则都指定了,合法性的确定也就很简单了:A%3 != B%3。

OK,剩下的输出就很简单了,为了好看一点,这里希望直接按题目给的图表示出A、B的位置,如:“A:d10, B:e3”,还有颜色:D。

A的行号:A/3+8;

A的列号:A%3+d;

B的行号:B/3+1;

B的列号:B%3+d;

代码如下(注释掉的部分只是为了输出更“漂亮”一点):

1 #include2 //#include 3 4 //HANDLE hStdout;5 //CONSOLE_SCREEN_BUFFER_INFO csbiInfo;6 //WORD wOldColorAttrs;7 8 int_tmain(intargc, _TCHAR*argv[])9 {10 //hStdout = GetStdHandle(STD_OUTPUT_HANDLE);11 //GetConsoleScreenBufferInfo(hStdout, &csbiInfo);12 //wOldColorAttrs = csbiInfo.wAttributes;13 14 intnNum=81;//nNum表示所有位置(含非法),故nNum = 3 * 3 * 3 * 315 while( nNum--)16 {17 if( nNum%9%3!=nNum/9%3)18 {19 //SetConsoleTextAttribute(hStdout, FOREGROUND_RED | FOREGROUND_INTENSITY);20 printf("A:%x%02d", nNum%9%3+0xd, nNum%9/3+8);21 //SetConsoleTextAttribute(hStdout, FOREGROUND_BLUE | FOREGROUND_INTENSITY);22 printf("B:%x%02d", nNum/9%3+0xd, nNum/9/3+1);23 }24 if(!(nNum%9) )25 printf("\n");26 };27 printf("\n");28 //SetConsoleTextAttribute(hStdout, wOldColorAttrs);29 return0;30 }

输出:

PS: 刚写完,没有来得及总结更多,急着向LP炫耀。但上面的思路应该比较清晰了,也不管书上的答案了,反正我感觉我这点代码效率应该也不会低到哪儿吧:-)?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值