本文主要通过基于一张简单的游戏地图,实现深度优先、广度游戏、Dijkstra算法(说明:主要参考了别人滴代码,自己改写了下)。
深度优先算法, 先附截图一张:
深度优先搜索算法在搜索过程中不考虑各个边的开销,只考虑路径的选择,基本思路是:站在一个连通图的的一个节点上,然后尽可能的沿着一条边深入,当遇到死角时回溯,然后继续搜索,直到搜索到目的节点为止,深度优先一般使用栈结构实现,结合上面滴图 , 应该比较容易理解了。
广度优先搜索, 在附截图一张 :
从图就可以很显然的看出,广度优先和深度优先的不同,广度优先是:在一个连通图的节点上依次向下遍历它所有的子节点,直到找到目的节点为止。广度优先一般使用队列结构实现。
Dijkstra算法,依然附上截图二张:
Dijkstra是典型的最短路径搜索算法,一般是从一点出发到另外一点的最短路径,但是它遍历的节点数太多,效率比较底。
分析一下上图: 从节点1出发:可以到达节点为节点3、节点2,比较他们到节点1的距离,将较小的节点2加入最短路径树。在依次比较节点5和节点3的大小,将较小的节点3加入最短路径数,继续比较下去直到搜索到目的节点。
前面滴分析,可能表达滴不太好。 下面是我修改了滴源码,是基于一张简单的地图,在地图上搜索目的节点,依次用深度优先、广度优先、Dijkstra算法实现。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Stack;
/**
*
* @author yinzhuo
*
*/
public class Arithmatic {
boolean flag = true;
// 一张地图
static int[][] map = new int[][]// 地图数组
{
{ 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 },
{ 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0 },
{ 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0 },
{ 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0 },
{ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
//深度优先所使用的栈
Stack
HashMap
//出发点
int[] source = {2,2};
//目标点
int[] target = {21,22};
//已经访问过的点
int[][] visited=new int[map.length][map[0].length];//0 未去过 1 去过
//当前点的八方
int[][] sequence={
{0,1},{0,-1},
{-1,0},{1,0},
{-1,1},{-1,-1},
{1,-1},{1,1}
};
//访问经过的路径总长度
int count = 0;
LinkedList
//记录到每个点的最短路径 for Dijkstra
HashMap
//记录路径长度 for Dijkstra
int[][] length=new int[map.length][map[0].length];
/**
* @param args
*/
public static void main(String[] args) {
Arithmatic a = new Arithmatic();
System.out.println("-----------深度优先搜索算法实现---------");
a.DFS();
System.out.println(a.count);
int[] temp = a.target;
while(true){
int[][] tempA=a.hm.get(temp[0]+":"+temp[1]);
System.out.println("(" + tempA[0][0] + "," + tempA[0][1] + ")" + "--" + "(" + tempA[1][0] + "," + tempA[1][1] + ")");
if(tempA[1][0]==a.source[0]&&tempA[1][1]==a.source[1]){//判断有否到出发点
break;
}
temp=tempA[1];
}
// for(int i = 0; i < a.stack.size(); i++){
// System.out.println("(" + a.stack.get(i)[0][0] + "," + a.stack.get(i)[0][1] + ")" + "--" + "(" + a.stack.get(i)[1][0] + "," + a.stack.get(i)[1][1] + ")");
// }
a.visited=new int[map.length][map[0].length];
System.out.println("-----------广度优先搜索算法实现---------");
a.BFS();
System.out.println(a.count);
temp = a.target;
while(true){
int[][] tempA=a.hm.get(temp[0]+":"+temp[1]);
System.out.println("(" + tempA[0][0] + "," + tempA[0][1] + ")" + "--" + "(" + tempA[1][0] + "," + tempA[1][1] + ")");
if(tempA[1][0]==a.source[0]&&tempA[1][1]==a.source[1]){//判断有否到出发点
break;
}
temp=tempA[1];
}
// for(int i = 0; i < a.queue.size(); i++){
// System.out.println("(" + a.queue.get(i)[0][0] + "," + a.queue.get(i)[0][1] + ")" + "--" + "(" + a.queue.get(i)[1][0] + "," + a.queue.get(i)[1][1] + ")");
// }
a.visited=new int[map.length][map[0].length];
System.out.println("----------Dijkstra算法实现--------------");
a.Dijkstra();
System.out.println(a.count);
ArrayList
for(int[][] t: alPath){
System.out.println("(" + t[0][0] + "," + t[0][1] + ")" + "--" + "(" + t[1][0] + "," + t[1][1] + ")");
}
}
/**
* 深度优先搜索算法
*/
public void DFS() {
//开始路径
int[][] start = {{source[0],source[1]},{source[0],source[1]}};
stack.push(start);
while(flag){
int[][] currentEdge=stack.pop();//从栈顶取出边
int[] tempTarget=currentEdge[1];//取出此边的目的点
//判断目的点是否去过,若去过则直接进入下次循环
if(visited[tempTarget[1]][tempTarget[0]]==1){
continue;
}
count++;
visited[tempTarget[1]][tempTarget[0]]=1;//标识目的点为访问过
//记录此临时目的点的父节点
hm.put(tempTarget[0]+":"+tempTarget[1],new int[][]{currentEdge[1],currentEdge[0]});
//判断有否找到目的点
if(tempTarget[0]==target[0]&&tempTarget[1]==target[1]){
break;
}
//将所有可能的边入栈
int currCol=tempTarget[0];
int currRow=tempTarget[1];
//将它的周围相连点都加入到栈中
for(int[] rc:sequence){
int i=rc[1];
int j=rc[0];
if(i==0&&j==0){continue;}
if(currRow+i>=0&&currRow+i