广度优先搜索(Breadth First Search,BFS)

本文介绍了一种基于广度优先搜索(BFS)的算法实现,通过C和Java两种语言展示如何寻找从起点到终点的最短路径。该算法适用于解决网格地图中的路径寻找问题,利用队列数据结构来实现节点的逐级遍历。
广度优先搜索

思想:以一个未被访问的结点作为起始结点,访问其所有相邻结点,然后对每一个相邻的结点,再访问它们相邻的未被访问的结点。
实现:使用队列从起始结点到子结点扩展,在遍历图中相当于前序遍历

Sample In
5 4
0 0 1 0
0 0 0 0
0 0 1 0
0 1 0 0
0 0 0 1
1 1 4 3

Sample Out
7

//C代码
#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;
struct note{
    int x;
    int y;
    int s;//步数
};

int main(){
    struct note que[2501];//队列
    int head,tail;//队列头尾指针
    int i,j,k,n,m,startx,starty,p,q,tx,ty,flag;
    int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
    int a[51][51]={0};
    int book[51][51]={0};
    scanf("%d %d",&n,&m);
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
           scanf("%d",&a[i][j]);
        scanf("%d %d %d %d",&startx,&starty,&p,&q);
    //队列初始化
    head =1;
    tail =1;
    que[tail].x=startx;
    que[tail].y=starty;
    que[tail].s=0;
    tail++;
    book[startx][starty]=1;
    flag=0;
    while(head<tail){
        for(k=0;k<=3;k++){
            tx=que[head].x+next[k][0];
            ty=que[head].y+next[k][1];
            //判断是否越界
            if(tx<1||tx>n||ty<1||ty>m)
                continue;
            //判断是否是障碍物或已走过
            if(a[tx][ty]==0&&book[tx][ty]==0){
                //加入队列
                book[tx][ty] =1;
                que[tail].x=tx;
                que[tail].y=ty;
                que[tail].s=que[head].s+1;
                tail++;
            }
            if(tx==p&&ty==q){
                flag=1;
                break;
            }
        }
        if(flag==1) break;
        head++;
    }
    printf("%d",que[tail-1].s);
   return 0;
}
//Java代码
import java.util.Scanner;

public class Main {
    static int m,n;
    static int endX,endY;
    static int minStep = 2147483647;
    static int [][]next = {{0,1},{1,0},{0,-1},{-1,0}};//顺时针右下左上
    static int [][]a = new int[51][51] ;
    static int [][]book = new int[51][51];
    //模拟队列
    static int[]x = new int[51] ;
    static int[]y = new int[51] ;
    static int[]s = new int[51] ;
    public static int bfs(int startx,int starty,int endx,int endy){
        //初始化
        int head =1,tail =1;
        x[tail] = startx;
        y[tail] = starty;
        s[tail] = 0;
        book[head][tail] = 1;
        tail++;
        int flag = 0;
        while(head<tail){
            for(int k=0;k<=3;k++){
                int tx = x[head] + next[k][0];
                int ty = y[head] + next[k][1];
                //判断是否越界
                if(tx<1||tx>n||ty<1||ty>m) continue;
                //判断是否走过
                if(book[tx][ty] == 0 && a[tx][ty] == 0){
                    x[tail] = tx;
                    y[tail] = ty;
                    s[tail] = s[head]+1;
                    book[tx][ty] = 1;
                    tail++;
                }
                if(tx==endx && ty==endy){
                    flag = 1;
                    break;
                }
            }
            if(flag == 1) break;
            head++;
        }
        return s[tail-1];
    }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        m = in.nextInt();
        //地图读入
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                a[i][j] = in.nextInt();
            }
        }
        //读入起点终点
        int startX = in.nextInt();
        int startY = in.nextInt();
        endX = in.nextInt();
        endY = in.nextInt();
        book[startX][startY] = 1;
        minStep = bfs(startX,startY,endX,endY);
        System.out.println("最短路径长度为:"+minStep);
    }
}

代码转载自:https://pan.quark.cn/s/7f503284aed9 Hibernate的核心组件总数达到五个,具体包括:Session、SessionFactory、Transaction、Query以及Configuration。 这五个核心组件在各类开发项目中都具有普遍的应用性。 借助这些组件,不仅可以高效地进行持久化对象的读取与存储,还能够实现事务管理功能。 接下来将通过图形化的方式,逐一阐述这五个核心组件的具体细节。 依据所提供的文件内容,可以总结出以下几个关键知识点:### 1. SSH框架详细架构图尽管标题提及“SSH框架详细架构图”,但在描述部分并未直接呈现关于SSH的详细内容,而是转向介绍了Hibernate的核心接口。 然而,在此我们可以简要概述SSH框架(涵盖Spring、Struts、Hibernate)的核心理念及其在Java开发中的具体作用。 #### Spring框架- **定义**:Spring框架是一个开源架构,其设计目标在于简化企业级应用的开发流程。 - **特点**: - **分层结构**:该框架允许开发者根据实际需求选择性地采纳部分组件,而非强制使用全部功能。 - **可复用性**:Spring框架支持创建可在不同开发环境中重复利用的业务逻辑和数据访问组件。 - **核心构成**: - **核心容器**:该部分包含了Spring框架的基础功能,其核心在于`BeanFactory`,该组件通过工厂模式运作,并借助控制反转(IoC)理念,将配置和依赖管理与具体的应用代码进行有效分离。 - **Spring上下文**:提供一个配置文件,其中整合了诸如JNDI、EJB、邮件服务、国际化支持等企业级服务。 - **Spring AO...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值