初级BFS算法
题目链接:点击打开链接
代码实现:
package cn.hncu.serch.bfs;
import java.util.Scanner;
public class P1241 {
final static int dir[][]={ //表示8个方向
{-1,-1},{0,-1},{1,-1},{-1,0},{1,0},{-1,1},{0,1},{1,1}
};
static boolean isGoIn; //判断是否进入
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int m=sc.nextInt();
int n=sc.nextInt();
if(m==0){
break;
}
Plot plots[][]=new Plot[m][n];
//初始化
for(int i=0;i=0 && nx=0 && ny
package cn.hncu.serch.bfs;
public class Plot {
int x,y; //点的坐标
char c;
boolean isVisited=false;
}
1)普通队列
package cn.hncu.serch.bfs;
public class PlotQueue {
Plot plots[]=new Plot[100];
final int FORNT=0;
int end;
public boolean isEmpty(){
return end==0;
}
public void add(Plot plot){
plots[end++]=plot;
}
public Plot pop(){
if(isEmpty()){
return null;
}
Plot p=plots[FORNT];
//如果超过一个元素就把每个元素,往前挪一位
if(end>1){
for(int i=0;i
package cn.hncu.serch.bfs;
public class CirclingQueue {
//最多只能存储MAX_SIZE-1个元素,留一个位置用来区分,队列满和空
private Plot plots[];
private final int MAX_SIZE=80;
private int front;
private int end;
public CirclingQueue() {
plots=new Plot[MAX_SIZE];
front=0;
end=0;
}
public boolean isEmpty(){
//end与front位置重合时,表示队列空
return front==end;
}
public boolean isFull(){
//预留一个空间,当end距离front差一个位置时,表示队列满
return (end+1)%MAX_SIZE==front;
}
public void add(Plot plot){
if(isFull()){
return;
}
plots[end]=plot;
end=(end+1)%MAX_SIZE; //使指针循环
}
public Plot pop(){
if(isEmpty()){
return null;
}
Plot p=plots[front];
front=(front+1)%MAX_SIZE; //使指针循环
return p;
}
}