马走日 java
2015-12-05 13:18
309 查看
/* */ public class ShortCut { final static int MAX = 999; static int total = 8; // 顶点总数 static int MAXV = total * total; static int[][] matirx = new int[MAXV][MAXV]; // 顶点矩阵 public static void main(String[] args) { // TODO Auto-generated method stub int x0 = 0, y0 = 0; int x1 = 5, y1 = 2; int x3 = total * x0 + y0, y3 = x1 * total + y1; for (int i = 0; i < MAXV; i++) { for (int j = 0; j < MAXV; j++) { if (i == j) { matirx[i][j] = 0; } else { matirx[i][j] = MAX; } } } initGrf(); System.out.println("Dijkstra寻找最短路径 ---"); Dijkstra(matirx, x3, y3); } private static void initGrf() { int i, j, m, n; for (i = 0; i < total; i++) for (j = 0; j < total; j++) { m = i + 1; n = j - 2; if (m < total && n >= 0 && matirx[i * total + j][m * total + n] == MAX) matirx[i * total + j][m * total + n] = 1; m = i + 1; n = j + 2; if (m < total && n < total && matirx[i * total + j][m * total + n] == MAX) matirx[i * total + j][m * total + n] = 1; m = i - 1; n = j + 2; if (m >= 0 && n < total && matirx[i * total + j][m * total + n] == MAX) matirx[i * total + j][m * total + n] = 1; m = i - 1; n = j - 2; if (m >= 0 && n >= 0 && matirx[i * total + j][m * total + n] == MAX) matirx[i * total+ j][m * total + n] = 1; m = i + 2; n = j + 1; if (m < total && n < total && matirx[i * total + j][m * total + n] == MAX) matirx[i * total + j][m * total + n] = 1; m = i - 2; n = j - 1; if (m >= 0 && n >= 0 && matirx[i * total + j][m * total + n] == MAX) matirx[i * total + j][m * total + n] = 1; m = i + 2; n = j - 1; if (m < total && n >= 0 && matirx[i * total + j][m * total + n] == MAX) matirx[i * total + j][m * total + n] = 1; m = i - 2; n = j + 1; if (m >= 0 && n < total && matirx[i * total + j][m * total + n] == MAX) matirx[i * total + j][m * total + n] = 1; } } public static void Findpath(int path[], int y3, int x3) //前向递归查找路径上的顶点 { int k, x, y; k = path[y3]; if (k == x3) return; //找到了起点则返回 Findpath(path, k, x3); //找k顶点的前一个顶点 x = k / total; y = k % total; System.out.println("(" + x + "," + y + ")" + "--->"); } public static void Dispath(int dist[], int path[], int s[], int x3, int y3) { int x0, y0, x1, y1; x0 = x3 / total; y0 = x3 % total; x1 = y3 / total; y1 = y3 % total; System.out.println("从(" + x0 + "," + y0 + ")" + "到(" + x1 + "," + y1 + ")的一条最短路径为:"); System.out.println("(" + x0 + "," + y0 + ")" + "--->"); Findpath(path, y3, x3); /* 输出路径上的中间点 */ System.out.println("(" + x1 + "," + y1 + ")" + "--->"); System.out.println("共需走" + dist[y3] + "步"); } public static void Dijkstra(int matirx[][], int x3, int y3) { int dist[] = new int[MAXV], path[] = new int[MAXV]; int s[] = new int[MAXV]; int mindis, i, j, u; for (i = 0; i < MAXV; i++) { dist[i] = matirx[x3][i]; //距离初始化 s[i] = 0; //路径访问 if (matirx[x3][i] < MAX) // 路径初始化 path[i] = x3; else path[i] = -1; } s[x3] = 1; path[x3] = 0; //源点编号v0放入s中 for (i = 0; i < MAXV; i++) //循环直到所有顶点的最短路径都求出 { mindis = MAX; u = -1; for (j = 0; j < MAXV; j++) //选取不在s中且具有最小距离的顶点u if (s[j] == 0 && dist[j] < mindis) { u = j; mindis = dist[j]; } s[u] = 1; //顶点u加入s中 if (u == y3) { Dispath(dist, path, s, x3, y3); // 输出最短路径 return; } for (j = 0; j < MAXV; j++) ///修改不在s中的顶点的距离 if (s[j] == 0) if (matirx[u][j] < MAX && dist[u] + matirx[u][j] < dist[j]) { dist[j] = dist[u] + matirx[u][j]; path[j] = u; } } } }
相关文章推荐
- java ArrayList()的引用
- Java 并发专题 :FutureTask 实现预加载数据 在线看电子书、浏览器浏览网页等
- java环境配置
- MyEclipse中的main()和System.out.println()的快捷键输入设置
- 关于Eclipse打包签名失效的问题
- Myeclipse错误:Errors occurred during the build. Errors running builder 'DeploymentBuilder' on project
- SpringMVC知识一
- Maven +SpringMVC 搭建时候遇到视图view跳转失败问题
- java ssh整合出的错java.lang.NoSuchMethodError antlr.collections.AST.getLine()I
- 第二个spring,第一天
- Java web工程中获取系统精确时间(到秒级别)
- apktool 反编译 及 smali2java
- 一次诡异的日志死锁
- 一次诡异的日志死锁
- JavaFX入门(四):JavaFX布局(一)
- Java基础2——集合框架
- Spring MVC的基本概念
- Java中使用PrepateStatement并且like模糊查询
- Java匿名内部类
- java 读取properties文件 ---封装组件