跳转至

ABC265C Belt Conveyor

思路描述

  • 初始化一个大小为 $H \times W$ 的二维数组 vis,所有元素初始为 $0$,表示未访问过。
  • 从起点 (1, 1) 开始,记录两个变量 $x=1,y=1$。:
  • 如果当前位置 vis[i][j] 已经是 $1$,说明之前访问过,输出 -1 并结束程序。
  • 否则,将 vis[i][j] 标记为 $1$,继续根据当前位置的方向移动。
  • 移动时,根据当前格子的方向字符(UDLR)决定下一步坐标:
  • Ux - 1, y
  • Dx + 1, y
  • Lx, y - 1
  • Rx, y + 1
  • 如果移动后的位置超出边界,停止并输出当前位置的坐标。
  • 重复上述过程直到结束。

实现示例

#include <bits/stdc++.h>
using namespace std;
int h, w;
char g[505][505];
bool vis[505][505];
int main()
{
    cin >> h >> w;
    for (int i = 1; i <= h; i++)
    {
        for (int j = 1; j <= w; j++)
        {
            cin >> g[i][j]; // 注意用字符数组
        }
    }
    int x = 1, y = 1; // 起始位置
    while (true)
    {
        if (vis[x][y] == 1) // 已经访问过直接结束即可
        {
            cout << "-1";
            return 0;
        }
        vis[x][y] = 1; // 打标记
        if (g[x][y] == 'U')
        {
            if (x - 1 >= 1) // 往上走不越界
                x--;
            else // 越界了就直接输出
            {
                cout << x << " " << y;
                return 0;
            }
        }
        else if (g[x][y] == 'D')
        {
            if (x + 1 <= h) // 往下走不越界
                x++;
            else // 越界了直接输出
            {
                cout << x << " " << y;
                return 0;
            }
        }
        else if (g[x][y] == 'L')
        {
            if (y - 1 >= 1) // 往左走不越界
                y--;
            else // 越界了直接输出
            {
                cout << x << " " << y;
                return 0;
            }
        }
        else if (g[x][y] == 'R')
        {
            if (y + 1 <= w) // 往右走不越界
                y++;
            else // 越界了直接输出
            {
                cout << x << " " << y;
                return 0;
            }
        }
    }
}

注意

不要写多个 if 语句,避免一次移动执行多个条件的代码。