`
lony1107
  • 浏览: 7512 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
最近访客 更多访客>>
社区版块
存档分类
最新评论

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

阅读更多

中国象棋,棋盘上只有“将”和“帅”,按照中国象棋中两者不能照面的规则,输出两者所有的合法位置组合,要求在代码中只能使用一个变量。


将象棋里两个老大分别可以走的9个位置编号如下:

1 2 3

4 5 6

7 8 9


书中给出的第一个解法好长,我想到了后面的解法认为不需要这么复杂的实现也暂时没有去看了……以下是我的想法:


编号后很快可以发现每一列的共同点是编号对模3运算的结果是相等的,问题就好解决了,两者的位置编号模3运算结果不等则是合法的位置组合,将其输出即可,否则是不合法的。这样的过程用2层嵌套的循环即可,那么问题就是怎样只使用一个变量实现2层嵌套的循环。


这个题给我的启发主要是这样一个循环的实现,如下:

 

int i = 81;
while (i-- != 0) {
	if (i / 9 % 3 != i % 9 % 3)
		System.out.println("A=" + (i / 9 + 1) + "\tB=" + (i % 9 + 1));
}
     


用一个int实现了等效于如下的循环:

for (int i = 8; i > 0; i--) {
	for (int j = 8; j > 0; j--) {
		if (i % 3 != j % 3)
			System.out.println("A=" + (i + 1) + "\tB=" + (j + 1));
	}
}
 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics