编辑代码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
  // 读取目标序列的长度
  const length = Number(await readline());
  // 读取目标序列,转换为数字数组
  const arr = (await readline()).split(" ").map(Number);
  // 读取矩阵的尺寸:len行,tate列
  const [len, tate] = (await readline()).split(" ").map(Number);

  // 读取矩阵数据
  const matrix = [];
  for (let i = 0; i < len; i++) {
    matrix.push((await readline()).split(" ").map(Number));
  }

  // 创建访问标记数组,用于记录已访问的位置
  const visited = new Array(len).fill(0).map(() => new Array(tate).fill(false));

  // 定义四个方向的偏移量:上、左、右、下
  const offsets = [
    [-1, 0], // 上
    [0, -1], // 左
    [0, 1], // 右
    [1, 0], // 下
  ];

  /**
   * 深度优先搜索函数
   * @param x - 当前位置的行坐标
   * @param y - 当前位置的列坐标
   * @param i - 当前匹配到目标序列的位置
   * @param path - 记录路径的数组
   * @returns {boolean} - 是否找到完整的路径
   */
  const dfs = (x, y, i, path) => {
    // 如果已经匹配完整个序列,返回成功
    if (i == length) return true;

    // 尝试四个方向
    for (const [offsetX, offsetY] of offsets) {
      const newX = x + offsetX;
      const newY = y + offsetY;

      // 检查新位置是否有效:
      // 1. 不越界
      // 2. 值匹配目标序列
      // 3. 未被访问过
      if (
        newX >= 0 &&
        newX < len &&
        newY >= 0 &&
        newY < tate &&
        matrix[newX][newY] == arr[i] &&
        !visited[newX][newY]
      ) {
        // 标记访问并记录路径
        visited[newX][newY] = true;
        path.push(`${newX} ${newY}`);

        // 继续搜索下一个位置
        if (dfs(newX, newY, i + 1, path)) return true;

        // 回溯:取消访问标记并移除路径
        visited[newX][newY] = false;
        path.pop();
      }
    }
    return false;
  };

  // 存储找到的路径
  const path = [];

  // 遍历矩阵寻找起点(与目标序列第一个数字相同的位置)
  for (let i = 0; i < len; i++) {
    for (let j = 0; j < tate; j++) {
      if (matrix[i][j] == arr[0]) {
        // 标记起点并开始搜索
        visited[i][j] = true;
        path.push(`${i} ${j}`);

        // 如果找到完整路径,输出结果
        if (dfs(i, j, 1, path)) console.log(path.join(" "));

        // 回溯:重置起点状态
        visited[i][j] = false;
        path.pop();
      }
    }
  }

  // 如果没有找到任何路径,输出error
  if (!path.length) console.log("error");
})();