走迷宫题都用BFS。
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
typedef pair<int, int> PII;
const int N = 310;
int n, m;
char f[N][N]; //f存初始地图
int dist[N][N]; //dist存每个点离起点的距离
PII st, ed; //起点,终点坐标
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
int bfs()
{
queue<PII> q; //队列用来放坐标
q.push(st);
dist[st.first][st.second] = 0; //初始化起点距离
while (q.size())
{
auto t = q.front();
q.pop();
for (int i = 0; i < 4; i ++ ) //往上下左右四个方向一步一步尝试
{
int x = t.first + dx[i], y = t.second + dy[i];
if (x >= 0 && x < n && y >= 0 && y < m && f[x][y] != '#')
{
dist[x][y] = dist[t.first][t.second] + 1; //更新距离
if (f[x][y] == '*') return dist[x][y]; //抵达终点,返回距离
f[x][y] = '#'; //走过的地方不再走
q.push({x, y}); //加入周围的点
}
}
}
return -1;
}
int main()
{
while (cin >> n >> m, n || m) //n,m同时为0则退出循环
{
for (int i = 0; i < n; i ++ )
{
cin >> f[i];
for (int j = 0; j < m; j ++ )
{
if (f[i][j] == '@') st = {i, j}; //获取起点和终点坐标
if (f[i][j] == '*') ed = {i, j};
}
}
cout << bfs() << endl;
}
return 0;
}