P4554 小明的游戏

#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。

下面是代码的主要部分的详细解释:

  1. 预处理和定义

    • _CRT_SECURE_NO_WARNINGS:这是一个预处理指令,用于关闭某些编译器警告,特别是与不安全字符串操作相关的警告。
    • 导入所需的头文件:<iostream><algorithm><cstring><deque>
    • 定义了一些宏和类型别名来简化代码。
    • 定义了一个二维字符数组 g 来存储网格。
    • 定义了一个双端队列 q 来存储待处理的节点。
    • 定义了一个二维数组 dist 来存储从起点到每个节点的最短距离。
    • 定义了两个方向数组 dx 和 dy 来表示上下左右四个方向。
  2. bfs 函数

    • 这是一个广度优先搜索(BFS)函数,用于计算从给定起点 (x4, y4) 到终点 (x2, y2) 的最短路径。
    • 它首先将起点加入队列,并将起点到起点的距离设置为0。
    • 然后,它进入一个循环,直到队列为空。
    • 在每次迭代中,它都会取出队列的前端节点,并检查其所有相邻节点。
    • 如果相邻节点与当前节点有相同的字符,则将其加入队列的前端,并保持其距离不变。
    • 如果相邻节点与当前节点有不同的字符,则将其加入队列的后端,并将其距离增加1。
    • 如果找到了终点,则返回其距离。
    • 如果队列为空但还没有找到终点,则返回-1。
  3. main 函数

    • 这个函数读取输入并调用 bfs 函数来计算最短路径。
    • 它首先读取网格的大小 (n, m) 和网格本身。
    • 然后,它重置 dist 数组和 q 队列。
    • 接下来,它读取起点 (x1, y3) 和终点 (x2, y2)
    • 调用 bfs 函数计算最短路径,并打印结果。
    • 如果输入的网格大小为 (0, 0),则退出循环。

注意:代码中有一些变量名(如 x1y3)可能不是完全直观的,这可能会使代码的可读性降低。通常,为了代码的可读性和可维护性,选择更有描述性的变量名会更好

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值