关于迷宫问题的DFS,用数组的方式来做,在之前的博客上有写过。
https://blog.csdn.net/Edwinwzy/article/details/107356078
下面直接来看这道题目
书上这个是用队列的方式来写,由于之前对STL不是特别熟悉,所以对于队列的写法有些生疏。因此在此笔记中,通过书上代码实现,并加详细注释的方式来进行学习。
大致的思路就如上图所示
那么下面是代码(含详细注释)
如果要赋值粘贴代码:
#include<bits/stdc++.h>
using namespace std;
char room[23][23]; //给房间定义数组大小为23,由于行列方向最大只有20,所以取稍大即可
int dir[4][2]={{-1,0},{1,0},{1,0},{0,1}};//四个方向分别是左上右下,这个方向的判断是根据x,y的单位长度变化
int Wx,Hy,num; //定义行Wx列Hy与总数变量num
#define CHECK(x,y) (x<Wx&&x>=0&&y>=0&&y<Hy)//此函数用来检测点(x,y)是否在这个房间内
struct node{int x,int y};//定义坐标点结构体
void BFS(int dx,int dy){
num=1; //由于起始点也算作能到达的瓷砖数之一,所以总数初值为1
queue<node>q;//定义队列,用来存放坐标点
node start,next;//定义结构体变量,开始坐标点start与下一个坐标点next
start.x=dx;//给开始坐标赋初值
start.y=dy;
q.push(start);//将开始坐标点放入队列
while(!q.empty())//队列不为空则持续循环
{
start=q.font();//返回队首元素
q.pop();//移除队首元素
//cout<<"out"<<start.x<<start.y<<endl;//打印当前输出的位置坐标
for(int i=0;i<4;i++)//i<4的原因是因为四个方向进行搜索
{
next.x=start.x+dir[i][0];//x方向加上搜索方向x的位移量
next.y=start.y+dir[i][1];//y方向加上搜索方向y的位移量
if(CHECK(next.x,next.y)&&room[next.x][next.y]=='.')//判断是否越界与当前瓷砖是否能走
{
room[next.x][next.y]='#';//如果能走则标记
num++;//总瓷砖数加一
q.push(next);//将下一个节点放入队列
}
}
}
}
int main()
{
int x,y,dx,dy;//定义坐标点x,y,起点坐标dx,dy
while(cin>>Wx>>Hy){//输入行列
if(Wx==0&Hy==0)
break;
for(y=0;y<Hy;y++){
for(x=0;x<Wx;x++)
{
cin>>room[x][y];//给房间中的格子赋值
if(room[x][y]=='@')//如果当前瓷砖的值为@,则设立起点坐标
{
dx=x;
dy=y;
}
}
}
num=0;
BFS(dx,dy);//从起点坐标开始搜索
cout<<num<<endl;
}
return 0;
}