dfs,bfs求最短路径, java实现

13 篇文章 0 订阅
8 篇文章 0 订阅

刚看过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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值