马走日 java

/*

 */


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;
				}
			}
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值