刚看过LinkedList的知识,对java中的队列和栈有了更深的理解,于是趁热打铁,自己实现了bfs和dfs求最短路径。其中bfs由队列实现,dfs由递归实现(即栈)。
话不多说,上代码:
import java.util.Scanner;
import java.util.LinkedList;
import java.util.Queue;
public class Main
{
static char c[][]=new char[100][100];
static int dx[]={-1,0,1,0};
static int dy[]={0,-1,0,1};
static boolean visit[][]=new boolean[100][100];
static int Maxn=2000000000;
public static class coordinate//java中没有struct 只好用内部类来代替
{
private int x=-1;
private int y=-1;
private int d=-1;
public coordinate( int x,int y,int d)
{
this.x=x;
this.y=y;
this.d=d;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public int getD() {
return d;
}
public void setD(int d) {
this.d = d;
}
}
public static boolean Right(int x,int y,int n,char c[][])//判断条件
{
if(x>=0&&x<n&&y>=0&&y<n&&c[x][y]!='#'&&!visit[x][y])
{
return true;
}
return false;
}
private static int bfs(int x,int y,int n,char c[][])
{
int count=0;
Queue<coordinate> q=new LinkedList<coordinate>();
coordinate start=new coordinate(x,y,0);
visit[x][y]=true;
q.add(start);//将s作为起始顶点加入queue
while(!q.isEmpty())
{
coordinate top=q.poll();//取出队首元素
for(int i=0;i<4;i++)
{
int xx=top.x+dx[i];
int yy=top.y+dy[i];
if(Right(xx,yy,n,c)==true)
{
visit[xx][yy]=true;
int dd=top.d+1;
if(dd>count)
{
count=dd;
}
if(c[xx][yy]=='O')
{
return count;
}
else
{
coordinate next=new coordinate(xx,yy,dd);
q.add(next);//添加到队尾
}
}
}
}
return count;
}
static int count=Maxn;
static int dfs(int x,int y,int d,int n)
{
visit[x][y]=true;
for(int i=0;i<4;i++)
{
int xx=x+dx[i];
int yy=y+dy[i];
if(Right(xx,yy,n,c)==true)
{
visit[xx][yy]=true;
int dd=d+1;
//System.out.println(xx+" "+yy+" "+dd);
if(c[xx][yy]=='O')
{
//System.out.println("true");
//System.out.println(dd);
//System.out.println(count);
if(dd<count)
{
count=dd;
}
}
else
{
dfs(xx,yy,dd,n);
}
visit[xx][yy]=false;//适用不同的路径,因为要找的是最短路径
}
}
return count;
}
public static void main(String args[])
{
int fx=-1,fy=-1;
Scanner cin = new Scanner(System.in);
int n=cin.nextInt();
for(int i=0;i<n;i++)
{
String s=cin.next();//java没办法直接输入char数组,只好以String代替之后用charAt函数取用。
for(int j=0;j<n;j++)
{
visit[i][j]=false;
c[i][j]=s.charAt(j);
if(c[i][j]=='@')
{
fx=i;
fy=j;
}
}
}
System.out.println("bfs: "+bfs(fx,fy,n,c));
for(int i=0;i<n;i++)//bfs之后重置visit数组
{
for(int j=0;j<n;j++)
{
visit[i][j]=false;
}
}
System.out.println("dfs: "+dfs(fx,fy,0,n));
}
}
测试样例:
4
@***
##**
#***
***O
bfs: 6
dfs: 6