广度优先搜索算法

本文详细介绍了广度优先搜索算法在Android游戏开发中的应用,包括地图类设计、广度优先搜索算法实现及具体示例。通过实例分析,展示了如何利用广度优先搜索解决游戏中路径寻找的问题,提供了宝贵的开发经验和代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

学自《ANDROID_2.0游戏开发实战宝典》

 

 

 

 

地图类MapList.java

package com.liangbinny.my;

public class MapList {
    public static int[] source={1,1};//出发点
    public static int[][] target={//目标点坐标数组
        {5,4}
    };
    public static int[][] map = new int[][] //地图数组 , 1表示不可达区域
    {
        {1,1,1,1,1,1,1},
        {1,0,0,0,0,0,1},
        {1,1,0,1,1,0,1},
        {1,1,0,0,1,0,1},
        {1,1,1,1,0,0,1},
        {1,1,1,1,0,1,1},
        {1,1,1,1,1,1,1}
    };
}

 

广搜算法BFS.java

package com.liangbinny.my;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;

/**
 * <p><b>
 * 广度优先搜索算法 (breadth first search)
 * 原理是:从原点出发,将所有连接到该原点的结点访问,然后再继续下一层,直到找到目标点
 * 广度优先使用的是队列(LinkedList),先进先出的原理实现广度,
 * 可以这样理解,就是先遍历该原结点的所有相邻结点,进队列,先进先处理,就从广度范围内处理结点
 * 跟栈恰恰相反,而栈刚好用在深度搜索
 * </b></p>
 */
public class BFS {
    int[] source = MapList.source; //出发点
    int[] target = MapList.target[0]; //目标点
    LinkedList<int[][]> queue = new LinkedList<int[][]>(); //广度优先所用队列
    int[][] visited = new int[MapList.map.length][MapList.map[0].length]; //0 未去过 1 去过  , 数组是三维,new的是行数列数
    ArrayList<int[][]> searchProcess = new ArrayList<int[][]>(); //搜索过程
    HashMap<String, int[][]> hm = new HashMap<String, int[][]>(); //结果路径记录
    //这个代表可以移动的8个方向
    int[][] sequence={
        {0,1},{0,-1},
        {-1,0},{1,0},
        {-1,1},{-1,-1},
        {1,-1},{1,1}
    };
    int[][] map = MapList.map;
   
    public void calcBFS(){ //广度搜索优先算法
        //开始状态,这个看作是一条边,开始结点(start[0][0],start[0][1]),另一个结点是(start[1][0],start[1][1])
        int[][] start = {
            {source[0],source[1]},
            {source[0],source[1]}
        };
        queue.offer(start);//入列
        while(true){
            int[][] currentEdge = queue.poll();  //队列取边
            int[] tempTarget = currentEdge[1];  //边的顶点
            //是否已经访问过
            if (visited[tempTarget[1]][tempTarget[0]]==1) {
                continue;
            }
            //标识目的点为访问过
            visited[tempTarget[1]][tempTarget[0]] = 1;
            //记录搜索过程
            searchProcess.add(currentEdge);
            //记录此临时目的点的父节点    (tempTarget[0],tempTarget[1]) 在 currentEdge[1],currentEdge[0] 这个边上
            //最终搜索到显示时,就是根据这个hashmap,从目标点出发,一直往回找寻经过的点
            hm.put(tempTarget[0]+":"+tempTarget[1], new int[][]{currentEdge[1],currentEdge[0]});
            //找到目标
            if (tempTarget[0]==target[0]&&tempTarget[1]==target[1]) {
                break;
            }
            //将该点的所有可能边入队列,根据先进现出规则,就实现了广度搜索
            int currCol = tempTarget[0];
            int currRow = tempTarget[1];
            for (int[] rc : sequence) {  //8个方向都有可能到达
                int i = rc[0];  
                int j = rc[1]; 
                if (currRow+i>=0&&currRow+i<map.length&&currCol+j>=0&&currCol+j<map[0].length&&map[currRow+i][currCol+j]!=1) {
                    int[][] tempEdge = {
                        {tempTarget[0],tempTarget[1]},
                        {currCol+j,currRow+i}
                    };
                    queue.offer(tempEdge);
                }
            }
        }
    }
   
    public static void main(String[] args) {
        BFS bfs = new BFS();
        bfs.calcBFS();  //搜索
        System.out.println("====================广度搜索过程=========================");
        //打印搜索过程路径
        ArrayList<int[][]> list = bfs.searchProcess;
        for (int[][] is : list) {
            System.out.println("start:"+is[0][0]+","+is[0][1]+";end:"+is[1][0]+","+is[1][1]);
        }
       
        System.out.println("====================最终路径=========================");
        //打印最终的结果路径
        //本质是根据搜索路径过程,原着目标点反序,只需要依次找父结点,最后得到的是原点即可
        int[] temp=bfs.target;
        while(true){
            int[][] tempA=bfs.hm.get(temp[0]+":"+temp[1]);
            System.out.println("start:"+tempA[0][0]+","+tempA[0][1]+";end:"+tempA[1][0]+","+tempA[1][1]);
            if(tempA[1][0]==bfs.source[0]&&tempA[1][1]==bfs.source[1]){//判断有否到出发点
                break;
            }
            temp=tempA[1]; 
        }
    }
}

 

 

广度搜索北大acm的例子,本人写的有点烂。

http://poj.org/problem?id=3278

解题代码:

 

import java.util.HashMap;
import java.util.LinkedList;
import java.util.Scanner;

public class Main {
    HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();
    boolean[] visited = new boolean[200010];
    
    public void calc(int source , int target){
        int[] start = {source,source};
        LinkedList<int[]> queue = new LinkedList<int[]>();
        queue.offer(start);
        while(true){
            int[] currentEdge = queue.poll();
            int tempTarget = currentEdge[1];
            if (visited[tempTarget]) {
                continue;
            }
            visited[tempTarget]=true;
            hm.put(currentEdge[1],currentEdge[0]);
            if (tempTarget==target) {
                break;
            }
            int k1 = tempTarget+1;
            int k2 = tempTarget*2;
            int k3 = tempTarget-1;
            
            if (k1<=100000&&!visited[k1]) {
                queue.offer(new int[]{tempTarget,k1});
            }
            
            if (k2<=100000&&!visited[k2]) {
                queue.offer(new int[]{tempTarget,k2});
            }
            
            if (k3>=0&&!visited[k3]) {
                int[] tempEdge = new int[]{tempTarget,k3};
                queue.offer(tempEdge);
            }
            
        }
    }
    
    public static void main(String[] args) {
        Main test = new Main();
        Scanner cin = new Scanner(System.in);
        int source = cin.nextInt();
        int target = cin.nextInt();
        if (source == target) {
            System.out.println(0);
        }else {
            test.calc(source,target);
            int temp = target;
            int count = 0;
            while(true){
                count++;
                int tempA=test.hm.get(temp);
                if(tempA==source){
                    break;
                }
                temp=tempA;  
            }
            System.out.println(count);
        }
    }
}

 

 

内容概要:本文详细介绍了扫描单分子定位显微镜(scanSMLM)技术及其在三维超分辨体积成像中的应用。scanSMLM通过电调透镜(ETL)实现快速轴向扫描,结合4f检测系统将不同焦平面的荧光信号聚焦到固定成像面,从而实现快速、大视场的三维超分辨成像。文章不仅涵盖了系统硬件的设计与实现,还提供了详细的软件代码实现,包括ETL控制、3D样本模拟、体积扫描、单分子定位、3D重建和分子聚类分析等功能。此外,文章还比较了循环扫描与常规扫描模式,展示了前者在光漂白效应上的优势,并通过荧光珠校准、肌动蛋白丝、线粒体网络和流感A病毒血凝素(HA)蛋白聚类的三维成像实验,验证了系统的性能和应用潜力。最后,文章深入探讨了HA蛋白聚类与病毒感染的关系,模拟了24小时内HA聚类的动态变化,提供了从分子到细胞尺度的多尺度分析能力。 适合人群:具备生物学、物理学或工程学背景,对超分辨显微成像技术感兴趣的科研人员,尤其是从事细胞生物学、病毒学或光学成像研究的科学家和技术人员。 使用场景及目标:①理解和掌握scanSMLM技术的工作原理及其在三维超分辨成像中的应用;②学习如何通过Python代码实现完整的scanSMLM系统,包括硬件控制、图像采集、3D重建和数据分析;③应用于单分子水平研究细胞内结构和动态过程,如病毒入侵机制、蛋白质聚类等。 其他说明:本文提供的代码不仅实现了scanSMLM系统的完整工作流程,还涵盖了多种超分辨成像技术的模拟和比较,如STED、GSDIM等。此外,文章还强调了系统在硬件改动小、成像速度快等方面的优势,为研究人员提供了从理论到实践的全面指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值