专项训练(BFS模板)

广度优先搜索

1.迷宫图

最短路径,联通性

2.图论

N叉树,二叉树,无根树

图()

参考视频

https://www.bilibili.com/video/av65110926

 

 

 

m行n列迷宫,1为墙,0为路,求起点到终点的最短路径,并打印出所有的最短路线

第一行输入m,n

输入迷宫

最后一行输入起点和终点坐标

测试数据

5 4
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
1 1 4 3

结果

7
(2,1)
(3,1)
(4,1)
(5,1)
(5,2)
(5,3)
7
(2,1)
(2,2)
(2,3)
(2,4)
(3,4)
(4,4)
 

import java.util.Scanner;
import java.util.Arrays;
class bfs1{
	int x;
	int y;
	int step;//记录步数
	int pre;//记录路径,记录上一步的点
}

public class BFS模板 {
	static int m,n,sx,sy,ex,ey;
	static int[][] a=new int[10][10];//记录迷宫
	static int[][] dis={{1,0},{-1,0},{0,-1},{0,1}};//上下左右四个方向
	static boolean[][] book=new boolean[10][10];//记录该点已走过
	static bfs1[] q=new bfs1[100];//数组模拟队列
	static int head=0,tail=1;//初始化队列头,尾
	
	static void bfs(){//核心
		q[0]=new bfs1();//一定要new一个对象
		q[0].x=sx;
		q[0].y=sy;
		q[0].step=0;
		q[0].pre=-1;
		while(headm||ty>n) continue;//超界
				if(a[tx][ty]==1) continue;//墙
				if(!book[tx][ty]){//未走过
					book[tx][ty]=true;
					q[tail]=new bfs1();
					q[tail].x=tx;
					q[tail].y=ty;
					q[tail].step=q[head].step+1;//步数+1
					q[tail].pre=head;//记录上一步的点
					tail++;
				}
				if(tx==ex&&ty==ey) {
					System.out.println(q[tail-1].step);//打印步数
					print(head);//打印路径,注:忘了打印起点和终点
				}
			}
			head++;
		} 
	}
	
	static void print(int k){//递归打印,
		if(q[k].pre!=-1){
			print(q[k].pre);
			System.out.println("("+q[k].x+","+q[k].y+")");
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc=new Scanner(System.in);
		for(int i=0;i<10;i++){
			Arrays.fill(a[i], -1);
			Arrays.fill(book[i], false);
		}
		m=sc.nextInt();
		n=sc.nextInt();
		for(int i=1;i<=m;i++){
			for(int j=1;j<=n;j++){
				a[i][j]=sc.nextInt();
			}
		}
		sx=sc.nextInt();
		sy=sc.nextInt();
		ex=sc.nextInt();
		ey=sc.nextInt();
		bfs();
	}

}

 

你可能感兴趣的:(专项训练)