1
Maze(60分)
题目内容:
給你一個迷宮,
S為起點,E為終點。
請你找出走出迷宮所需要花費的最短步數。
你只能往上下左右四個方向移動。
输入格式:
第一行有一個數字T,代表有T組測資。
每組測資的第一行有兩個數字R、C,
代表迷宮的大小(R x C)。
接下來R行,每行有C個字元來描述迷宮,
'.'代表可以行走的路,
'X'代表不可行走的牆壁,
'S'代表起點,
'E'代表終點。
測資範圍:
T < 100
2 < R,C <= 30
输出格式:
對於每組測資,計算由起點到達終點的最少步數。
測資保證一定存在至少一條由起點通往終點的路徑。
將每組測資的步數加總後再輸出。
输入样例:
2
5 5
SXXXX
...XX
.X...
..XXX
....E
6 6
......
.S..X.
XXX...
....X.
.X..XX
.EX...
输出样例:
18
这个就是经典的迷宫问题,用广度优先搜索算法
#include<iostream>
#include<queue>
using namespace std;
bool visited[50][50]; // 查看地图是否被访问
char map[50][50]; // 标记地图
int dx[4] = { 0,1,0,-1 }; // x方向移动路径
int dy[4] = { 1,0,-1,0 };
int n, m;
int starti, startj;
int endi, endj;
struct Node
{
int i;
int j;
int s; // 起点到当前点的最短路径
};
bool judge(int i, int j)
{
if (j < 0 || j>=m || i < 0 || i >= n)
return true;
if (visited[i][j])
return true;
if (map[i][j]=='X')
return true;
return false;
}
Node bfs()
{
queue<Node> q;
Node cur, next;
int ni, nj;
cur.i = starti;
cur.j = startj;
cur.s = 0;
visited[starti][startj] = true;
q.push(cur);
while (!q.empty())
{
cur = q.front();
q.pop();
if (cur.i == endi && cur.j == endj)
return cur;
for (int i = 0; i < 4; i++)
{
// 四种遍历方法
ni = cur.i + dx[i];
nj = cur.j + dy[i];
if (judge(ni, nj))
{
// 如果这种走法不行,尝试下一种走法
continue;
}
// 可以走
next.i = ni;
next.j = nj;
next.s = cur.s + 1;
q.push(next);
}
}
return cur;
}
int main()
{
int N;
cin >> N;
int sum = 0;
while (N--)
{
cin >> n >> m;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> map[i][j];
if (map[i][j] == 'S')
{
starti = i;
startj = j;
}
if (map[i][j] == 'E')
{
endi = i;
endj = j;
}
}
}
memset(visited, 0, sizeof(visited));
Node ans = bfs();
sum += ans.s;
}
cout << sum << endl;
}