Java实现对图的广度优先搜索

来源:互联网 发布:php过滤敏感词的例子 编辑:程序博客网 时间:2024/06/06 10:56
import java.util.LinkedList;import java.util.Queue;//二维数组的广度优先遍历,级图的遍历public class BFSArray {static int[][] map;//定义二维数组static int row;//行static int col;//列static int endx,endy;//记录结束位置static int num=1;//记录访问的顺序//定义坐标移动的方向--右-左-下-上static int[][] dex={{1,0},{-1,0},{0,-1},{0,1}}; public static void main(String[] args) {//初始化数组map=new int[5][5];row=5;col=5;endx=4;endy=4;BFS();//查看遍历的路径for (int i = 0; i < row; i++) {for (int j = 0; j < col; j++) {System.out.print(map[i][j]+"\t");}System.out.println();}}//广度优先遍历核心算法public static void BFS(){//初始化一个空的队列用于存储每一个点Queue<Point> q=new LinkedList<Point>();//初始化开始遍历的点为【0,0】Point poin=new Point(0,0); //将第一个点从队尾插入q.add(poin);//把第一个点置为,已访问map[poin.x][poin.y]=num++;while(!q.isEmpty()){//只要队列不为空就一直执行//取出并移除当前队列中队列头的元素Point pinNow=q.poll();//退出条件,达到最终要的点if(pinNow.x==endx&&pinNow.y==endy){return;}//循环方向数组for (int i = 0; i < 4; i++) {//获得该点的坐标,并通过dex数组记录的方向进行移动int m=pinNow.x+dex[i][0];int n=pinNow.y+dex[i][1];//对新的坐标m,n进行判断 是否可以继续遍历if(m>=0&&m<row&&n>=0&&n<col){//数组下标没有越界//System.out.println("can");if(map[m][n]==0){//没有访问过//System.out.println(m+"....."+n);//输出要添加到队列的点q.add(new Point(m,n));//添加到队列中,并把该点置为已访问map[m][n]=num++;}}}}}}//定义图的点的坐标class Point{int x;int y;public Point(){}public Point(int x, int y) {super();this.x = x;this.y = y;}

运行结果


原创粉丝点击