北大acm3083,BFS与DFS的引用

文章详细描述了如何使用C++编程实现四向迷宫搜索算法,包括深度优先搜索(DFS)和广度优先搜索(BFS),以解决从起点到终点的最短路径问题。

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

else if(build[i][j+1])

DFS_Left(i,j+1,1);

else if(build[i+1][j])

DFS_Left(i+1,j,2);

else if(build[i][j-1])

DFS_Left(i,j-1,3);

break;

}

case 2://面向:→ 检索顺序:↑1 →2 ↓3 ←0

{

if(build[i][j+1])

DFS_Left(i,j+1,1);

else if(build[i+1][j])

DFS_Left(i+1,j,2);

else if(build[i][j-1])

DFS_Left(i,j-1,3);

else if(build[i-1][j])

DFS_Left(i-1,j,0);

break;

}

case 3://面向:↓ 检索顺序:→2 ↓3 ←0 ↑1

{

if(build[i+1][j])

DFS_Left(i+1,j,2);

else if(build[i][j-1])

DFS_Left(i,j-1,3);

else if(build[i-1][j])

DFS_Left(i-1,j,0);

else if(build[i][j+1])

DFS_Left(i,j+1,1);

break;

}

}

return;//void没有返回值 但是要结束可以使用不存在返回值的return

}

void DFS_Right(int i,int j,int face)//i,j分别为所在位置的横纵坐标,face是所面向的右转的位置,用来确认自身的位置

{

Rstep++;

if(e.xi && e.yj)//若走到终点直接停止

return;

switch(face)

{

case 0://面向←0 检索顺序:↑1 ←0 ↓3 →2

{

if(build[i][j+1])

DFS_Right(i,j+1,1);

else if(build[i-1][j])

DFS_Right(i-1,j,0);

else if(build[i][j-1])

DFS_Right(i,j-1,3);

else if(build[i+1][j])

DFS_Right(i+1,j,2);

break;

}

case 1://面向↑1 检索顺序:→2 ↑1 ←0 ↓3

{

if(build[i+1][j])

DFS_Right(i+1,j,2);

else if(build[i][j+1])

DFS_Right(i,j+1,1);

else if(build[i-1][j])

DFS_Right(i-1,j,0);

else if(build[i][j-1])

DFS_Right(i,j-1,3);

break;

}

case 2://面向→2 检索顺序:↓3 →2 ↑1 ←0

{

if(build[i][j-1])

DFS_Right(i,j-1,3);

else if(build[i+1][j])

DFS_Right(i+1,j,2);

else if(build[i][j+1])

DFS_Right(i,j+1,1);

else if(build[i-1][j])

DFS_Right(i-1,j,0);

break;

}

case 3://面向↓3 检索顺序:←0 ↓3 →2 ↑1

{

if(build[i-1][j])

DFS_Right(i-1,j,0);

else if(build[i][j-1])

DFS_Right(i,j-1,3);

else if(build[i+1][j])

DFS_Right(i+1,j,2);

else if(build[i][j+1])

DFS_Right(i,j+1,1);

break;

}

}

return;//void没有返回值 但是要结束可以使用不存在返回值的return

}

void BFS_Min(int i,int j)

{

bool visited[255][255];//标记已经走过的路程

memset(visited,false,sizeof(visited));//初始化所有元素

queueq;//定义一个队列

min1.x=i;

min1.y=j;//定义起点

visited[min1.x][min1.y]=true;//设计成已经访问过

min1.min=1;//初始化步数

q.push(min1);

int flag=0;

while(!q.empty())

{

if(flag)

break;

min1=q.front();

q.pop();

for(int i=0;i<4;i++)//一共只可以尝试四个点

{

if(i == 0)

{

min2.x=min1.x-1;

min2.y=min1.y;

}

else if(i == 1)

{

min2.x=min1.x+1;

min2.y=min1.y;

}

else if(i == 2)

{

min2.x=min1.x;

min2.y=min1.y-1;

}

else if(i == 3)

{

min2.x=min1.x;

min2.y=min1.y+1;

}//分别探索四个点,顺序没有要求 探索到四个点就行

if(min2.x>=1 && min2.x<=high && min2.y>=1 && min2.y<=wide && !visited[min2.x][min2.y] && build[min2.x][min2.y])

{//要确保没被访问过 并且可走

min2.min=min1.min+1;

visited[min2.x][min2.y]=true;

if(min2.xe.x && min2.ye.y)

{

flag=1;

MinStep=min2.min;

break;

}

q.push(min2);

}

}

}

}

int main()

{

int sum;//定义一共有多少个迷宫

cin>>sum;

while(sum–)//此类的循环可以常用

{

int face;//定义起点的朝向,也就是初始位置的朝向

cin>>wide>>high;//注意high是横 wide是纵

Lstep=0;

Rstep=0;//初始化两个步数

MinStep=0;

memset(build,false,sizeof(build));//初始化所有的迷宫原数均为false

for(int i=1;i<=high;i++)//从1开始循环更加容易懂

{

for(int j=1;j<=wide;j++)

{

char ch;

cin>>ch;

if(ch == ‘.’)

build[i][j]=true;

if(ch == ‘S’)

{

s.x=i;

s.y=j;

build[i][j]=true;

if(i == high)

face=0;//初始方向面向0←

else if(j == wide)

face=1;//初始方向面向1↑

else if(i == 1)

face=2;//初始方向面向2→

else if(j == 1)

face=3;//初始方向面向3↓

}

if(ch == ‘E’)

{

e.x=i;

e.y=j;

build[i][j]=true;

}

}

}

DFS_Left(s.x,s.y,face);

cout<<Lstep<<" ";

DFS_Right(s.x,s.y,face);

cout<<Rstep<<" ";

BFS_Min(s.x,s.y);

cout<<MinStep<<endl;

}

return 1;

}

再提供一些测试数据(感谢这位朋友发的数据): 添加链接描述

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

最后

为了帮助大家更好的了解前端,特别整理了《前端工程师面试手册》电子稿文件。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

目、讲解视频,并且后续会持续更新**

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-rue0Y5KF-1712908202507)]

最后

为了帮助大家更好的了解前端,特别整理了《前端工程师面试手册》电子稿文件。

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-1iQXW8BB-1712908202507)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值