#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<algorithm>
#include<cstring>
#include<deque>
#define x first
#define y second
using namespace std;
const int N = 510;
typedef pair<int, int>PII;
int n, m;
char g[N][N];
int x1, y3, x2, y2;
deque<PII>q;
int dist[N][N];
int dx[] = { -1,0,1,0 };
int dy[] = { 0,1,0,-1 };
int bfs(int x4, int y4)
{
q.push_back({ x4,y4 });
dist[x4][y4] = 0;
while (q.size())
{
auto t = q.front();
q.pop_front();
char ch = g[t.x][t.y];
for (int i = 0; i < 4; i++) {
int a = t.x + dx[i], b = t.y + dy[i];
if (a < 0 || b < 0 || a >= n || b >= m) {
continue;
}
if (dist[a][b] >= 0) {
continue;
}
if (g[a][b] == ch) {
dist[a][b] = dist[t.x][t.y];
q.push_front({ a,b });
}
if (g[a][b] != ch) {
dist[a][b] = dist[t.x][t.y]+1;
q.push_back({ a,b });
}
if (a == x2 && b == y2) {
return dist[x2][y2];
}
}
}
return -1;
}
int main()
{
while (scanf("%d %d", &n, &m) ) {
if (n == 0 && m == 0)
{
break;
}
for (int i = 0; i < n; i++) {
scanf("%s", &g[i]);
}
memset(dist, -1, sizeof dist);
q.clear();
scanf("%d %d %d %d", &x1, &y3, &x2, &y2);
int ret = bfs(x1, y3);
printf("%d\n", ret);
}
return 0;
}
这段代码是用C++编写的,其主要功能是读取一个二维字符网格(地图),然后计算从给定的起点到终点的最短路径。路径的“最短”是根据网格中字符的连续性来定义的。具体来说,如果在移动过程中遇到与当前位置字符相同的相邻位置,那么这种移动不增加路径长度;但如果遇到不同字符的相邻位置,则路径长度加1。
下面是代码的主要部分的详细解释:
-
预处理和定义:
_CRT_SECURE_NO_WARNINGS
:这是一个预处理指令,用于关闭某些编译器警告,特别是与不安全字符串操作相关的警告。- 导入所需的头文件:
<iostream>
,<algorithm>
,<cstring>
,<deque>
。 - 定义了一些宏和类型别名来简化代码。
- 定义了一个二维字符数组
g
来存储网格。 - 定义了一个双端队列
q
来存储待处理的节点。 - 定义了一个二维数组
dist
来存储从起点到每个节点的最短距离。 - 定义了两个方向数组
dx
和dy
来表示上下左右四个方向。
-
bfs
函数:- 这是一个广度优先搜索(BFS)函数,用于计算从给定起点
(x4, y4)
到终点(x2, y2)
的最短路径。 - 它首先将起点加入队列,并将起点到起点的距离设置为0。
- 然后,它进入一个循环,直到队列为空。
- 在每次迭代中,它都会取出队列的前端节点,并检查其所有相邻节点。
- 如果相邻节点与当前节点有相同的字符,则将其加入队列的前端,并保持其距离不变。
- 如果相邻节点与当前节点有不同的字符,则将其加入队列的后端,并将其距离增加1。
- 如果找到了终点,则返回其距离。
- 如果队列为空但还没有找到终点,则返回-1。
- 这是一个广度优先搜索(BFS)函数,用于计算从给定起点
-
main
函数:- 这个函数读取输入并调用
bfs
函数来计算最短路径。 - 它首先读取网格的大小
(n, m)
和网格本身。 - 然后,它重置
dist
数组和q
队列。 - 接下来,它读取起点
(x1, y3)
和终点(x2, y2)
。 - 调用
bfs
函数计算最短路径,并打印结果。 - 如果输入的网格大小为
(0, 0)
,则退出循环。
- 这个函数读取输入并调用
注意:代码中有一些变量名(如 x1
, y3
)可能不是完全直观的,这可能会使代码的可读性降低。通常,为了代码的可读性和可维护性,选择更有描述性的变量名会更好