您的位置:首页 > 编程语言 > Java开发

马走日 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;
}
}
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: