Syins写的bfs

bfs(广度优先搜索)

与dfs一条路走到底再返回不同的是bfs是层层递进的,bfs先考虑了当前能走的所有方向(或者说先考虑了当前能做的所有操作)
bfs的层层递进式能够再找最短路径之类的问题时,带来不少方便。
因为层层递进所以如果当前想要进行的操作已经被进行过了的话,去掉这种操作的可能性,因为现在进行该操作得到的最后答案必然不是最小
这里采用了结构体来存储,因为这个比较方便;(下面是一个例题可以来感受一下用法,还是挺好理解的)

代码:小蝌蚪找妈妈👇

给出一个n*m的地图,如果是1则不能走,如果是0,则可以走,
在地图后会先后给出小蝌蚪的起点和妈妈的位置(题目确保二者都在0上);

#include <iostream>
using namespace std;
struct xxx{
    int h,l,s;
};
int main(){
    xxx b[2500];//这里是考虑了50*50的地图
    int i,j,th,tl,kh,kl,eh,el,f,n,m,a[50][50],t,w,c[4][2]={{1,0},{0,1},{-1,0},{0,-1}};//c数组用来进行上下左右的方向移动
    while (cin>>n>>m){
        for(i=0;i<n;i++)
            for(j=0;j<m;j++)
                cin>>a[i][j];
        cin>>kh>>kl>>eh>>el;//读入起点和终点
        kh--;//个人喜欢从0开始
        kl--;
        eh--;
        el--;
        t=w=f=0;
        b[w].h=kh;
        b[w].l=kl;
        b[w].s=0;
        w++;
        while (t<w){
            for(i=0;i<4;i++){
                th=b[t].h+c[i][0];
                tl=b[t].l+c[i][1];
                if(th<0||th>=n||tl<0||tl>=n) continue;//判断是否越界
                if(a[th][tl]==0){//判断是否能走
                    a[th][tl]=1;//如果能就将这个点变成不能走
                    b[w].h=th;//同时读入这个点
                    b[w].l=tl;
                    b[w].s=b[t].s+1;
                    w++;
                }
                if(th==eh&&tl==el){
                    f=1;
                    break;
                }
            }
            if(f)break;
            t++;//这里t递增,可以保证不会重复判定
        }
        if(f)cout<<b[w-1].s<<endl;
        else cout<<"impossible"<<endl;
    }
    return  0;
}

这里因为本人这时候初学的bfs所以用的是数组
用队列或者链表也可以实现

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
如果您想使用 BFS(广度优先搜索)算法来实现小车在迷宫中的路径规划,可以考虑在程序中使用坐标表示小车当前的位置。以下是一个示例: ```c //定义迷宫大小 #define MAZE_WIDTH 10 #define MAZE_HEIGHT 10 //定义迷宫地图 int maze[MAZE_HEIGHT][MAZE_WIDTH] = { {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 0, 0, 0, 1, 0, 0, 0, 0, 1}, {1, 0, 1, 0, 1, 0, 1, 1, 0, 1}, {1, 0, 1, 0, 1, 0, 0, 1, 0, 1}, {1, 0, 1, 0, 1, 1, 0, 1, 0, 1}, {1, 0, 0, 0, 0, 0, 0, 1, 0, 1}, {1, 0, 1, 1, 1, 1, 0, 1, 0, 1}, {1, 0, 0, 0, 0, 0, 0, 0, 0, 1}, {1, 0, 1, 1, 1, 1, 1, 1, 0, 1}, {1, 1, 1, 1, 1, 1, 1, 1, 1, 1} }; //定义坐标结构体 struct Coordinate { int x; int y; }; //定义队列结构体 struct Queue { Coordinate data[MAZE_WIDTH * MAZE_HEIGHT]; int front; int rear; }; //初始化队列 void initQueue(Queue *q) { q->front = 0; q->rear = 0; } //判断队列是否为空 int isQueueEmpty(Queue *q) { return (q->front == q->rear); } //入队 void enqueue(Queue *q, Coordinate c) { q->data[q->rear] = c; q->rear++; } //出队 Coordinate dequeue(Queue *q) { Coordinate c = q->data[q->front]; q->front++; return c; } //判断坐标是否合法 int isValidCoordinate(Coordinate c) { return (c.x >= 0 && c.x < MAZE_WIDTH && c.y >= 0 && c.y < MAZE_HEIGHT && maze[c.y][c.x] == 0); } //BFS算法 void bfs(Coordinate start, Coordinate end) { Queue q; initQueue(&q); int visited[MAZE_HEIGHT][MAZE_WIDTH] = {0}; //记录是否访问过 int distance[MAZE_HEIGHT][MAZE_WIDTH] = {0}; //记录距离 Coordinate prev[MAZE_HEIGHT][MAZE_WIDTH]; //记录路径 enqueue(&q, start); visited[start.y][start.x] = 1; while (!isQueueEmpty(&q)) { Coordinate current = dequeue(&q); if (current.x == end.x && current.y == end.y) { break; } Coordinate next; next.x = current.x + 1; next.y = current.y; if (isValidCoordinate(next) && !visited[next.y][next.x]) { enqueue(&q, next); visited[next.y][next.x] = 1; distance[next.y][next.x] = distance[current.y][current.x] + 1; prev[next.y][next.x] = current; } next.x = current.x - 1; next.y = current.y; if (isValidCoordinate(next) && !visited[next.y][next.x]) { enqueue(&q, next); visited[next.y][next.x] = 1; distance[next.y][next.x] = distance[current.y][current.x] + 1; prev[next.y][next.x] = current; } next.x = current.x; next.y = current.y + 1; if (isValidCoordinate(next) && !visited[next.y][next.x]) { enqueue(&q, next); visited[next.y][next.x] = 1; distance[next.y][next.x] = distance[current.y][current.x] + 1; prev[next.y][next.x] = current; } next.x = current.x; next.y = current.y - 1; if (isValidCoordinate(next) && !visited[next.y][next.x]) { enqueue(&q, next); visited[next.y][next.x] = 1; distance[next.y][next.x] = distance[current.y][current.x] + 1; prev[next.y][next.x] = current; } } //输出路径 Coordinate c = end; while (c.x != start.x || c.y != start.y) { Serial.print("("); Serial.print(c.x); Serial.print(", "); Serial.print(c.y); Serial.println(")"); c = prev[c.y][c.x]; } Serial.print("("); Serial.print(start.x); Serial.print(", "); Serial.print(start.y); Serial.println(")"); } ``` 此示例中,使用 `Coordinate` 结构体表示小车在迷宫中的坐标,使用 `Queue` 结构体实现 BFS 算法的队列。`isValidCoordinate` 函数判断坐标是否合法,`bfs` 函数实现广度优先搜索,并输出路径。在实际使用时,您需要根据具体情况修改和完善代码,例如根据传感器数据更新小车坐标等。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值