编程之美:中国象棋将帅问题_求职面试_非技术区_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 非技术区 > 求职面试 > 编程之美:中国象棋将帅问题

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

 2011/1/5 8:00:13  lony1107  http://lony1107.javaeye.com  我要评论(0)
  • 摘要:中国象棋,棋盘上只有“将”和“帅”,按照中国象棋中两者不能照面的规则,输出两者所有的合法位置组合,要求在代码中只能使用一个变量。将象棋里两个老大分别可以走的9个位置编号如下:123456789书中给出的第一个解法好长,我想到了后面的解法认为不需要这么复杂的实现也暂时没有去看了……以下是我的想法:编号后很快可以发现每一列的共同点是编号对模3运算的结果是相等的,问题就好解决了,两者的位置编号模3运算结果不等则是合法的位置组合,将其输出即可,否则是不合法的。这样的过程用2层嵌套的循环即可
  • 标签:问题 编程 编程之美

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


将象棋里两个老大分别可以走的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));
	}
}
?

?

发表评论
用户名: 匿名