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前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
最后
为了帮助大家更好的了解前端,特别整理了《前端工程师面试手册》电子稿文件。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
目、讲解视频,并且后续会持续更新**
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
[外链图片转存中…(img-rue0Y5KF-1712908202507)]
最后
为了帮助大家更好的了解前端,特别整理了《前端工程师面试手册》电子稿文件。
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-1iQXW8BB-1712908202507)]