最近在更新一些自己学的知识点
这次轮到bfs了
首先就要提到bfs和dfs的区别,dfs其实就是在搜索一棵树,之所以叫深度优先,就是说dfs会优先向下搜索,在搜索完一个结点后,它会优先去搜索这个结点的儿子结点。而bfs在此时则会优先搜索它的兄弟结点,所以我们会说bfs是按层搜索的算法
走迷宫
题目描述
给定一个n*m的二维字符数组,用来表示一个迷宫,数组中只包含’#‘或’.’,其中’.‘表示可以走的路,’#'表示不可通过的墙壁。
最初,有一个人位于起点S处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。
请问,该人从左上角移动至终点T处,至少需要移动多少次。
输入格式
第一行包含两个整数n和m。
接下来n行,每行包含m个字符,表示完整的二维字符数组迷宫。
输出格式
输出一个整数,表示从左上角移动至右下角的最少移动次数。
bfs通常用队列来实现
看题目我们可以得到,当走到点 ‘T’ 的时候就到了终点
所以当前点的横纵坐标与终点 ‘T’ 的坐标相同时,结束bfs
我们只需要每次去遍历这个点可以走的四个方向
判断每个方向是否可以走,并把新的状态入队列即可
char mat[1005][1005];
struct Node{
int x,y,step;
};
int dx[] = {-1,1,0,0} , dy[] = {0,0,-1,1};
int vis[1001][1001],n,m; //代表走过的位置
int bfs(int x,int y){
Node st;
st.x = x , st.y = y;
st.step = 0;
queue<Node>que;
que.push(st);
while(!que.empty()){
Node now = que.front(); que.pop();// 拿出队首元素 出队列
if(mat[now.x][now.y] == 'T'){
return now.step;
}
for(int i=0;i<4;i++){
int x = now.x + dx[i] , y = now.y + dy[i];
if(vis[x][y] == 0 && x>=1 && x<=n && y>=1 && y<=m && mat[x][y] != '#'){
Node tmp; tmp.x = x; tmp.y = y; tmp.step = now.step + 1;
vis[x][y] = 1;
que.push(tmp);
}
}
}
return -1;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%s",mat[i]+1);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(mat[i][j] == 'S'){
int ans = bfs(i,j);
if(ans == -1){
printf("没有找到迷宫终点!\n");
}else{
printf("最短的路径长度为:%d\n",ans);
}
return 0;
}
}
}
return 0;
}