作为“算法及实现”栏目的“抛砖引玉”之作,将自己2年多前实现的一个算法放出来。有一年IBM出了这个Java程序设计竞赛题,当时,自己花晚上时间用Java实现了。
[问题描述]:
任意给定一个正方形,将正方形的各边做n等分,并将相应各点连接成水平或垂直的直线,如果从正方形的左下角(0,0)出发,沿各边线或连接线,自左向右或自下而上的方向,到达正方形的右上角(n,n),请用JAVA程序计算并输出所有可能的路径总数和具体线路.请提供相关JAVA源程序和n=2,3,4时的输出结果。输出结果按以下方式:
以n=1为例:
n = 1
Path1: (0,0) - (0,1) - (1,1)
Path2: (0,0) - (1,0) - (1,1)
Total = 2
[设计简介]:
共设计3个类:
AixPoint:正方形问题的低层处理类,抽象正方形问题的每个访问点信息;
AixSquare:正方形问题的核心处理类,抽象正方形算法处理过程;
AixContest:正方形问题的客户调用处理类,抽象正方形问题的应用层。
[算法源码]:
AixPoint源码:
/** *//*******************************************************************************
* <<AIX 程序设计大赛---AIX正方形问题>>
* AIXContest ver1.0
* 开发作者: 成晓旭
* 项目简述: AIX程序设计的Java程序设计"AIX正方形问题"解决方案
* 启动时间: 2004年01月14日 20:00:08
* 完成时间: 2003年01月14日 20:09:00 <1个晚上>
*
* 开发环境: Windows2000 Professional + SUN J2SE1.4.2
* 开发工具: Rational Rose2002 Enterprise + JCreator2.5Pro
*
* 文件名称: AixPoint.java
* 简 介: 正方形问题的低层处理类,抽象正方形问题的每个访问点信息
*
* 备 注: <本系统的底层抽象>
*
* 修改时间1:
*
******************************************************************************/
package CXXSoft.Aix;
import java.awt.Point;
public class AixPoint extends Point
...{
private int moveUnit;
public boolean aheadExcess;
public boolean aboveExcess;
//类构造器
public AixPoint()
...{
aheadExcess = false;
aboveExcess = false;
moveUnit = 1;
}
//类构造器
public AixPoint(int x,int y)
...{
this();
this.x = x;
this.y = y;
}
//类构造器
public AixPoint(Point p)
...{
this();
this.x = p.x;
this.y = p.y;
}
//向左移动(前进)
public void goAhead()
...{
this.x += moveUnit;
}
//向左的反方向移动(后退)
public void goAheadReturn()
...{
this.x -= moveUnit;
}
//向上移动
public void goAbove()
...{
this.y += moveUnit;
}
//向上的反方向移动(后退)
public void goAboveReturn()
...{
this.y -= moveUnit;
}
//形成输出串
public String toString()
...{
return "("+ x + "," + y +")";
}
}