解题思路:参考广度优先搜索BFS(cx14b)
注意事项:因为是多组数据,记得清空visited[N][N],即 memset(visited, 0, sizeof(visited));
参考代码:
#include<bits/stdc++.h>
using namespace std;
const int N=105;
int r,c,n;
char mp[N][N];
int visited[N][N];
typedef struct node
{
int x,y;
int step; // 统计多少步
} Node;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
// 后续用于移动
// 检查是否可以通行
int check(Node p)
{
if(p.x<0 || p.x>=r || p.y<0 || p.y>=c) return 0;
// 更新判断条件:空地字符为'-',起点为'S',终点为'E'
if(mp[p.x][p.y] == '#') return 0;
return 1; // 否则可以通行
}
int bfs(Node begin, Node end)
{
// 重置visited数组
memset(visited, 0, sizeof(visited));
queue<Node> q; // 初始化队列
q.push(begin);
visited[begin.x][begin.y] = 1;
while(!q.empty()) // 非空
{
Node top = q.front(); // 取队首
q.pop(); // 出队
if(top.x == end.x && top.y == end.y)
return top.step;
// 尝试四个方向移动
for(int i=0; i<4; i++)
{
Node newnode;
newnode.x = top.x + dx[i]; // 移动
newnode.y = top.y + dy[i]; // 移动
if(check(newnode) == 1 && visited[newnode.x][newnode.y] == 0)
// 可以通行,且没有通行过
{
newnode.step = top.step + 1;
q.push(newnode);
visited[newnode.x][newnode.y] = 1;
}
}
}
return -1;
}
int main()
{
cin >> n;
while(n--)
{
cin >> r >> c;
Node begin, end;
bool foundStart = false, foundEnd = false;
// 读取迷宫并查找起点和终点
for(int i=0; i<r; i++)
for(int j=0; j<c; j++)
{
cin >> mp[i][j];
if(mp[i][j] == 'S')
{
begin.x = i;
begin.y = j;
foundStart = true;
}
if(mp[i][j] == 'E')
{
end.x = i;
end.y = j;
foundEnd = true;
}
}
// 确保找到了起点和终点
if(!foundStart || !foundEnd)
{
cout << -1 << endl;
continue;
}
begin.step = 0;
int cnt = bfs(begin, end);
cout << cnt << endl;
}
return 0;
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复