`

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

 
阅读更多

中国象棋中,将帅相隔遥远,并且不能照面,假设棋盘上只有将和帅两字,如下图所示(A表示将,B表示帅):A、B二子被限制在己方3 x 3的格子里运动,每一步,A、b分别可以横向或纵向移动一格,但不能沿对角线移动。另外,A不能面对B,也就是说,A和B不能处于同一纵向直线上,请写出一个程序,输出A、B所有合法的位置。要求代码中只能使用一个字节存储变量。


我们的常规思路是这样的:

- - 循环A的位置

- - - - 循环B的位置

- - - - - - 判断A、B的位置是否满足要求

- - - - - - - - 如果满足,则输出。

// 一般的程序员会这么干:(但这里使用了2个变量)
public class ChineseChess1 {
	public static void main(String[] args) {
		for (int i = 1; i <= 9; i++) {
			for (int j = 1; j <= 9; j++) {
				if (i % 3 != j % 3){
					System.out.println("a=" + i + ",b=" + j);
				}
			}
		}
	}
}

难点: 只能使用一个字节存储变量

// 经典解法java实现:
public class ChineseChess2 {
	public static void main(String[] args) {
		int i = 81;
		while (i-- != 0) {
			if (i / 9 % 3 == i % 9 % 3)
				continue;
			System.out.println("A=" + (i / 9 + 1) + " B=" + (i % 9 + 1));
		}
	}
}

// %3 正好是上面提到的 A 和 B 格子对应的数字 mod3 判断是否相等,相等则在一条直线上( A 和 B 碰面)。

上面的解法体现了程序的简约之美,可是让我这菜鸟程序员看的稀里糊涂: i / 9 % 3 == i % 9 % 3 是什么意思呢?

我们可以通过一个测试程序得到答案:

public class ChineseChess3 {
	public static void main(String[] args) {
		int i = 81;
		while (i-- > 0) {
			System.out.print(" " + i / 9);  // 相当于双层循环的外层循环,值循环了9次再改变
		}
		int j = 81;
		System.out.println();
		while (j-- > 0) {
			System.out.print(" " + j % 9);  // 相当于双层循环的内层循环,值循环依次改变9次
		}
	}
}
输出结果:

8 8 8 8 8 8 8 8 8 7 7 7 7 7 7 7 7 7 6 6 6 6 6 6 6 6 6 5 5 5 5 5 5 5 5 5 4 4 4 4 4 4 4 4 4 3 3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0
8 7 6 5 4 3 2 1 0 8 7 6 5 4 3 2 1 0 8 7 6 5 4 3 2 1 0 8 7 6 5 4 3 2 1 0 8 7 6 5 4 3 2 1 0 8 7 6 5 4 3 2 1 0 8 7 6 5 4 3 2 1 0 8 7 6 5 4 3 2 1 0 8 7 6 5 4 3 2 1 0


通过上面的例子,同样是可以解决问题,但解法上的优劣一目了然,算法真的是一门博大精深的学问,值得我们每个程序员去细细品味!





分享到:
评论

相关推荐

    象棋将帅问题-编程之美

    在本项目中,我们主要探讨的是“象棋将帅问题”,这是编程领域中一个有趣的算法挑战,它结合了中国的传统棋类游戏——象棋的规则与C++编程语言。通过这个项目,我们可以深入理解对象导向编程(OOP)以及如何用高效的...

    中国象棋将帅问题的算法和实现

    总的来说,解决中国象棋将帅问题的算法和实现涉及到了基础的数据结构、算法设计、面向对象编程以及游戏规则的理解。通过VC++这样的编程工具,我们可以将这些理论知识转化为实际的软件应用,使得玩家可以通过计算机...

    华为oj编美象棋将帅

    在华为的在线编程训练平台OJ(Online Judge)上,有一类高级题目是关于象棋游戏的算法实现,其中“华为oj编美象棋将帅”是一个典型的编程挑战。这个题目要求开发者用Java语言来编写程序,模拟中国象棋中的将(帅)的...

    python pygame 中国象棋

    在这个场景中,我们讨论的是使用Pygame构建一个中国象棋游戏。中国象棋是一种深受中国人民喜爱的传统策略棋类游戏,规则复杂且富有深度。 在Python Pygame中开发中国象棋,首先需要理解游戏的基本规则和棋子的移动...

    中国象棋(java实战)

    该项目通过Java编程语言实现了中国象棋的功能,旨在通过实际编程任务来掌握并应用Java编程的基础与高级特性。具体而言,该程序实现了人机对弈、棋谱记录与回放等功能,为学习者提供了实际操作的机会,加深了对鼠标...

    中国象棋vc源代码,一个基本的象棋程序,里面还有一些地方需要改进

    2. **游戏逻辑**:中国象棋的规则复杂,包括各种特殊移动(如“过河”、“士象不同行”、“将帅不照面”等)、吃子规则、将军和应将等。编写游戏逻辑是程序的核心部分,需要确保准确无误。 3. **用户交互**:程序...

    中国象棋C#版

    【中国象棋C#版】是一款使用C#编程语言开发的Windows桌面应用程序,它基于WinForms框架构建。这款游戏提供了一个平台,让用户可以体验到中国象棋的传统魅力,但不包含自动对弈的人工智能功能,意味着玩家需要与其他...

    中国象棋源代码(VC开发)

    【中国象棋源代码(VC开发)...通过学习和分析这个中国象棋源代码,开发者不仅可以掌握C++编程技能,还能了解到如何在Windows平台上构建图形用户界面,以及实现复杂逻辑的算法,同时还能锻炼到项目管理和团队合作的能力。

    C++写的中国象棋程序(附源代码)

    C++实现的中国象棋程序展示了如何利用面向对象编程的思想来解决问题。通过对棋盘、棋子、规则的抽象和封装,程序员能够构建出一个功能完备、运行稳定的象棋游戏。这种实践不仅有助于提升编程技能,也是理解和应用...

    象棋 Java 课程设计

    在中国象棋的Java实现过程中,首先需要对游戏规则有深入的理解,包括每个棋子的移动规则、吃子规则以及特殊规则如“将帅不相见”等。开发时,可以将棋盘和棋子分别抽象为棋盘类和棋子类,利用面向对象编程的思想进行...

    中国象棋脚本

    中国象棋,作为深受中国人民喜爱的传统棋类游戏,其规则严谨、策略性强,而“中国象棋脚本”则是将这种游戏逻辑转化为编程语言的一种实现。在这个场景中,标签为“java”,意味着我们讨论的是使用Java语言编写的中国...

    Java开发的中国象棋

    《Java开发的中国象棋》是一款基于J2SE平台构建的桌面游戏,它融合了中国的传统智慧与现代编程技术,让玩家在享受游戏乐趣的同时,体验到编程的魅力。这款象棋游戏的核心在于其规则的实现和人机交互的设计,下面我们...

    中国象棋C++

    【中国象棋C++】是基于C++编程语言实现的一款模拟中国传统棋类游戏——中国象棋的项目。在这个项目中,开发者用C++语言构建了象棋的基本规则、棋子移动逻辑以及用户交互界面,旨在提供一个可玩性强、规则准确的象棋...

    中国象棋.zip

    《中国象棋——Java编程实现解析》 中国象棋,作为我国传统棋类游戏的瑰宝,历史悠久,深受人们喜爱。随着计算机技术的发展,越来越多的传统游戏被编程语言所复现,其中Java作为一种广泛应用于各领域的高级编程语言...

    VC实现的中国象棋游戏

    《VC实现的中国象棋游戏》是一款基于Visual C++编程环境开发的中国象棋游戏,其核心亮点在于采用置换表(Transposition Table)与alpha-beta剪枝技术来优化博弈树的搜索过程,以实现人机对弈的功能。下面将详细阐述...

    中国象棋源码.zip

    《中国象棋源码》是针对游戏开发领域的一份重要资源,它包含了实现中国象棋游戏功能的所有编程代码。这份源码对于学习游戏编程、熟悉象棋规则算法以及提升编程技巧有着极大的帮助。以下是该源码中可能涉及的关键知识...

    java版中国象棋(人机对战)

    中国象棋有着独特的规则和策略,包括棋子的移动方式、吃子规则、将帅不照面等。在项目中,这些规则被转化为可执行的代码,使得计算机能够理解和执行。开发者需要深入理解象棋规则,并能将其精确地表达为编程逻辑。 ...

    基于Android实现的中国象棋的程序源码.zip

    《基于Android实现的中国象棋程序源码解析》 在移动设备上开发游戏已经成为现代软件开发的重要领域,尤其是在Android平台上,其开源特性和广泛的设备覆盖为开发者提供了广阔的空间。本项目“基于Android实现的中国...

    C语言中国象棋

    总的来说,C语言实现中国象棋是一个结合了数据结构、算法和基本界面交互的项目,对于学习者来说,既能加深对C语言的理解,也能提升问题解决和编程思维能力。通过这个项目,你可以了解到如何用程序模拟现实世界的问题...

    Java的中国象棋游戏

    首先,我们要明白,Java是一种跨平台的编程语言,具有丰富的库支持和强大的社区,适合开发桌面应用,如中国象棋游戏。游戏的核心部分包括棋盘界面的绘制、棋子移动规则的实现以及胜负判断功能。 1. **棋盘界面的...

Global site tag (gtag.js) - Google Analytics