1929. 镜子田地 环图 最长路 图的遍历 dfs

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1010;

int n, m;
char g[N][N];
int res;

void dfs(int x, int y, int q, int cnt) {
    if (g[x][y] == 0) { // 如果当前位置没有镜子,更新最大反射次数并返回
        res = max(res, cnt);
        return;
    }
    if (g[x][y] == '/') { // 如果当前位置是 / 放置的镜子
        if (q == 1) dfs(x, y - 1, 2, cnt + 1); // 向左反射
        if (q == 2) dfs(x + 1, y, 1, cnt + 1); // 向下反射
        if (q == 3) dfs(x, y + 1, 4, cnt + 1); // 向右反射
        if (q == 4) dfs(x - 1, y, 3, cnt + 1); // 向上反射
    }
    else if (g[x][y] == '\\') { // 如果当前位置是 \ 放置的镜子
        if (q == 1) dfs(x, y + 1, 4, cnt + 1); // 向右反射
        if (q == 2) dfs(x - 1, y, 3, cnt + 1); // 向上反射
        if (q == 3) dfs(x, y - 1, 2, cnt + 1); // 向左反射
        if (q == 4) dfs(x + 1, y, 1, cnt + 1); // 向下反射
    }
}

int main() {
    cin >> n >> m; // 输入田地的行数和列数
    for (int i = 1; i <= n; i ++)
        for (int j = 1; j <= m; j ++)
            cin >> g[i][j]; // 输入田地中镜子的摆放方式

    for (int i = 1; i <= n; i ++) { // 遍历每一行
        dfs(i, 1, 4, 0); // 从左边发射激光
        dfs(i, m, 2, 0); // 从右边发射激光
    }
    for (int i = 1; i <= m; i ++) { // 遍历每一列
        dfs(1, i, 1, 0); // 从上边发射激光
        dfs(n, i, 3, 0); // 从下边发射激光
    }

    cout << res; // 输出最大反射次数
    return 0;
}

dfs 函数是一个自定义的深度优先搜索算法实现。它的参数具体含义如下:

  • x: 这个参数表示当前正在访问的节点的行坐标。在图的遍历过程中,这个参数用于追踪当前的位置。
  • y: 这个参数表示当前正在访问的节点的列坐标。与 x 参数一起,它们确定了图中当前节点的位置。
  • q: 这个参数代表从当前节点出发时激光的方向。它影响激光如何在镜子间反射。例如,如果 q 为 1,则表示激光是水平向左发射的;如果为 2,则是垂直向下发射的;如果为 3,则是水平向右发射的;如果为 4,则是垂直向上发射的。
  • cnt: 这个参数记录了从初始位置出发到达当前节点的过程中,激光经过的镜子数量,即反射的次数。每次当激光碰到镜子并反射时,这个计数就会增加。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值