JAVA实现广度搜索&深度搜素

水两篇数据结构的内容~ ,这几天做了几道算法题。在ACM POJ上广度搜索深度搜素都是比较基础的算法,所以不针对具体的题目了。
先上JAVA版本的广度搜索核心代码:

//假设需要使用一个数组坐标系来实现,定义一个坐标类
public static class Point {
    int x,y;
    public Point(int x,int y) {
        this.x = x;
        this.y = y;
    }

在这里假设了使用数组,根据数组坐标搜索的场景,如果有其他需要更多信息的场景,可以在类中加入更多内容,比如:

public static class Point {
    int x,y,content;
    public Point(int x,int y) {
        this.x = x;
        this.y = y;
        this.content = content
    }

接下来就是广度搜索的核心代码

定义一个上下左右四方向数组
static int[][] dir = {{0,1},{0,-1},{1,0},{-1,0}};
//初始化一个队列
Queue<Point> q = new LinkedList<Point>();
//start,end 是搜索的起始点,定义为一个point加入到队列中
q.add(new Point(start,end));
//使用队列是否为空作为判定条件,进行循环直到队列为空。
while(!q.isEmpty()) {
//使用q.poll()把队列的头pop出来,利用它的坐标寻找下一个符合条件的点
    Point top = q.poll();
    int x = top.x;
    int y =top.y;
    for(k=0;k<4;k++) {
        Point tmp = new Point(x+dir[k][0],y+dir[k][1]);
//safe()判断是否超过边界值,satisfied判断是否满足我们搜索的条件
        if(safe(tmp) && satisfied(tmp)) {
            q.add(tmp)
        }
    }
}

就这样一个基本的广度搜索就实现了,有时候需要过滤掉已访问过的点可以用一个boolean的数组标记,或者把访问过的点重新赋值使其不满足条件。

JAVA实现深度搜索

//深度搜索有两种方式,一是递归实现,缺点是递归的共性即数据量大的时候会超时超内存,适用于小数据量的。二是使用数组模拟堆栈进行递归。与广度扩散式的搜索不同,深度是不撞南墙不回头一条道走到黑的方式。
staitic int[][] dir = {{0,1},{0,-1},{1,0},{-1,0}};
dfs(int x, int y) {
    if(safe(x+dir[0][0],y+dir[0][1]))
        dfs(x+dir[0][0],y+dir[0][1]);
    if(safe(x+dir[1][0],y+dir[1][1]))
        dfs(x+dir[1][0],y+dir[1][1]);
    if(safe(x+dir[2][0],y+dir[2][1])
        dfs(x+dir[2][0],y+dir[2][1]);
    if(safe(x+dir[3][0],y+dir[3][1]))
        dfs(x+dir[3][0],y+dir[3][1]);
}

为了明显的看出递归的顺序,把它们并列写出来。递归看代码理解不直观,在图上比划一下能明白它的逻辑就容易理解了。

基础算法最重要的就是理解内在的逻辑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值