import java.util.HashMap;
import java.util.Map;
/**
* 思路:到达{M,N}坐标的路径数 = 到达{M-1,N}的路径数 + 到达{M,N-1}的路径数
* 利用容器MAP,存储到达{x,y}的路径数,可以避免一些重复计算,提高效率
*
* @author xiaojianhx
* @date 2012-10-19
*/
public class Demo {
/** X坐标 */
private int maxX;
/** Y坐标 */
private int maxY;
/** 马的位置坐标 */
private int[] c_axis;
/** 马跳一步可到达的点坐标 */
private int[][] ma;
/** 到达某坐标的路径树 */
private Map<String, Long> data = new HashMap<String, Long>();
/**
* 获取结果
*
* @param b_axis
* 最大位置坐标
* @param c_axis
* 马的位置坐标
* @return Long 原点到达最大位置的路径数
*/
public Long getResult(int[] b_axis, int[] c_axis) {
// 初始化
init(b_axis, c_axis);
return getCount(maxX, maxY);
}
/**
* 初始化
*
* @param b_axis
* 最大坐标
* @param c_axis
* 马的位置坐标
*/
private void init(int[] b_axis, int[] c_axis) {
maxX = b_axis[0];
maxY = b_axis[1];
this.c_axis = c_axis;
// 初始化马跳一步可到达的点坐标
initMa();
}
/**
* 马跳一步可到达的点坐标
*/
private void initMa() {
ma = new int[maxX + 1][maxY + 1];
for (int i = 0; i <= maxX; i++) {
for (int j = 0; j <= maxY; j++) {
if (isMa(i, j)) {
ma[i][j] = -1;
} else {
ma[i][j] = 0;
}
}
}
}
/**
* 该点马跳一步,是否可到达
* <li>横纵坐标的差的绝对值为1和2</li>
* <li>包括马的原始位置</li>
*
* @param x
* X坐标
* @param y
* Y坐标
* @return boolean 该点马跳一步,是否可到达 TRUE:可到达;FALSE:不可到达
*/
private boolean isMa(int x, int y) {
int tmpX = Math.abs(x - c_axis[0]);
int tmpY = Math.abs(y - c_axis[1]);
if (tmpX == 1 && tmpY == 2) {
return true;
}
if (tmpX == 2 && tmpY == 1) {
return true;
}
return tmpX == 0 && tmpY == 0;
}
/**
* 计算到达{x,y}的路径数
*
* @param x
* X坐标
* @param y
* Y坐标
* @return Long 到达{x,y}的路径数
*/
private Long getCount(int x, int y) {
// 结束条件:如果{x,y}小于原点,或者为马点,记为0,退出
if (check(x, y)) {
return 0L;
}
// 结束条件:到达原点,记为1
if (x == 0 && y == 0) {
return 1L;
}
// MAP中获取到达{x-1,y}的路径数
Long value0 = data.get((x - 1) + "," + y);
// MAP中获取到达{x,y-1}的路径数
Long value1 = data.get(x + "," + (y - 1));
// 如果为空,则需要重新计算,(此处可大大提高执行效率)
value0 = getCount(x - 1, y, value0);
value1 = getCount(x, y - 1, value1);
// 到达{x,y}坐标的路径数 = 到达{x-1,y}的路径数 + 到达{x,y-1}的路径数,并保存到MAP,供其他使用
Long c = value0 + value1;
data.put(x + "," + y, c);
return c;
}
/**
* 获取Y的值
*
* @param x
* X坐标
* @param y
* Y坐标
* @param val
* 到达{x,y}的路径数
* @return Long 到达{x,y}的路径数
*/
private Long getCount(int x, int y, Long val) {
return val != null ? val : getCount(x, y);
}
/**
* 校验是否符合退出条件
* <li>{x,y}坐标小于原点</li>
* <li>{x,y}为马点</li>
*
* @param x
* X坐标
* @param y
* Y坐标
* @return boolean 验是否符合退出条件 TRUE:是;FALSE:不是
*/
private boolean check(int x, int y) {
return x < 0 || y < 0 || ma[x][y] == -1;
}
public static void main(String[] args) {
for (int i = 1; i <= 30; i++) {
long l0 = System.currentTimeMillis();
int[] b_axis = { i, i };
int[] c_axis = { 3, 2 };
long count = new Demo().getResult(b_axis, c_axis);
long l1 = System.currentTimeMillis();
System.out.println("{" + i + "," + i + "}:用时" + (l1 - l0) + "[MS],路径数" + count);
}
}
}
{1,1}:用时15[MS],路径数0
{2,2}:用时0[MS],路径数1
{3,3}:用时0[MS],路径数1
{4,4}:用时0[MS],路径数0
{5,5}:用时0[MS],路径数3
{6,6}:用时0[MS],路径数17
{7,7}:用时0[MS],路径数79
{8,8}:用时0[MS],路径数341
{9,9}:用时0[MS],路径数1420
{10,10}:用时0[MS],路径数5797
{11,11}:用时0[MS],路径数23387
{12,12}:用时0[MS],路径数93652
{13,13}:用时16[MS],路径数373218
{14,14}:用时0[MS],路径数1482570
{15,15}:用时0[MS],路径数5876662
{16,16}:用时0[MS],路径数23260199
{17,17}:用时0[MS],路径数91975390
{18,18}:用时0[MS],路径数363455085
{19,19}:用时0[MS],路径数1435667475
{20,20}:用时0[MS],路径数5669633400
{21,21}:用时0[MS],路径数22387608210
{22,22}:用时0[MS],路径数88399757790
{23,23}:用时16[MS],路径数349070903010
{24,24}:用时0[MS],路径数1378530151050
{25,25}:用时0[MS],路径数5444701787616
{26,26}:用时0[MS],路径数21507902567778
{27,27}:用时0[MS],路径数84975924943774
{28,28}:用时0[MS],路径数335794021531576
{29,29}:用时0[MS],路径数1327188954058100
{30,30}:用时0[MS],路径数5246593689252916
分享到:
相关推荐
因此称之为“马拦过河卒”。 棋盘用坐标表示,A点(0, 0)、B点(n, m)(n, m为不超过15的整数), 同样马的位置坐标是需要给出的。现在要求你计算出卒从A点能够到达B点的 路径的条数,假设马的位置是固定不动的,并不...
经典过河卒:A 点有一个过河卒,需要走到目标 B 点。卒行走规则:可以向下、或者向右。同时在棋盘上的任一点有一个对方的马(如上图的C点),该马所在的点和所有跳跃一步可达的点称为对方马的控制点。例如上图 C 点...
算法:C语言实现(第1~4部分)答案。
遗传算法 遗传算法:理论、应用及软件实现 遗传算法 遗传算法:理论、应用及软件实现 遗传算法 遗传算法:理论、应用及软件实现
学习算法必经之路——算法:C语言实现(第5部分).pdf
算法:C语言实现(第1~4部分)源代码
创新算法:TRIZ、系统创新和技术创造力
算法:C语言实现(第1~5部分)源代码+勘误 算法:C语言实现(第1~5部分)源代码+勘误 算法:C语言实现(第1~5部分)源代码+勘误 算法:C语言实现(第1~5部分)源代码+勘误 算法:C语言实现(第1~5部分)源代码+勘误
算法:C语言实现(第1-4部分)
算法:C语言实现算法:C语言实现算法:C语言实现算法:C语言实现
最快的排序算法 算法:从25匹马中选出最快的三匹马,排序算法数据结构
算法:C语言实现+第5部分+图算法 1到4部分的后续 第五部分
算法:C语言实现(第1~5部分 中英文),学习算法经典书籍
c++算法:图算法 程序 编程
二值化算法:Otsu算法、Bernsen算法、Niblack算法、循环阈值算法、迭代二值化算法等matlab代码,入门级
实现BF算法的改进算法:KMP算法和BM算法; 对上述3个算法进行时间复杂性分析,并设计实验程序验证分析结果。 附件中 3.3.h BF算法代码 3.5.h KMP算法代码 3.12.h BM算法代码
算法精解:C语言(中文版)_带书签,讲述C语言常用算法,学习用
非数值并行算法:遗传算法 原理 经典实例
三种成像算法:RD、RMA、CS 合成孔径雷达经典算法仿真 matlab
此资源吐血推荐 面向C#语言 介绍程序设计数据结构和算法!共分17章!...数据结构与算法:C#语言描述(中文).html (中文电子书) Data+Structures+And+Algorithms+Using+C#(英文).pdf (英文原版电子书)