問題一覧 > ショートコード

No.3544 Robot on Torus (C++)

レベル : / 実行時間制限 : 1ケース 2.000秒 / メモリ制限 : 1024 MB / スペシャルジャッジ問題 (複数の解が存在する可能性があります)
タグ : / 解いたユーザー数 16
作問者 : alcea / テスター : tRue naka9 Rho
ProblemId : 13280 / yukicoder contest TSG LIVE! 16 コードゴルフコンテスト (順位表) / 自分の提出
問題文最終更新日: 2026-05-16 12:27:38
yukicoder contest TSG LIVE! 16 コードゴルフコンテストの他の問題:

問題文

$H \times W$ のグリッドがあります。上から $i$ 行目、左から $j$ 列目のマス目を $(i, j)$ と表します。各マスの状態は文字 $S_{i, j}$ で表され、. であれば空きマス、# であれば障害物マス、R であればロボットマスであることを意味します。
また、このグリッドはトーラス状です。すなわち、マス $(i, W)$ の右にあるマスは $(i, 1)$ であり、マス $(H, j)$ の下にあるマスは $(1, j)$ です。
ロボットマスはグリッドにただ一つ存在し、はじめ、ロボットマスにはロボットが一つ置かれています。TSG くんは以下の操作を行えなくなるまで繰り返します。

  • ロボットの置かれているマスの右下のマスが障害物マスでなければ、ロボットを右下のマスに動かす。
操作が終了するか判定し、終了する場合は最終的にロボットが置かれているマスを求めてください。

入力

$H\ W$
$S_{1, 1} S_{1, 2}, \ldots, S_{1, W}$
$S_{2, 1} S_{2, 2}, \ldots, S_{2, W}$
$\vdots$
$S_{H, 1} S_{H, 2}, \ldots, S_{H, W}$

  • $1 \leq H, W \leq 1000$
  • $H, W$ は整数
  • $S_{i, j}$ は .#R のいずれか
  • $S_{i, j} =$ R となる $(i, j)$ がただ一つ存在する

出力

操作が終了する場合は、最終的にロボットが置かれているマスを $(i, j)$ として、$i, j$ を空白区切りで出力せよ。
操作が終了しない場合は、かわりに loop を出力せよ。
末尾の改行や空白の有無は問わない。また、空白区切りのかわりに改行区切りを用いてもよい。

スコア

想定解: $157$ bytes

スコア計算式 提出されたソースコードのコード長が $x$、この問題の想定解のコード長が $y$ であるとき、そのソースコードのスコアは、$\max(500 - x + y, 100)$ 点である。
この問題のスコアはこの問題に提出されたソースコードのスコアの最大値である。

サンプルプログラム (C++)

C++ での解答例を示す。このコードを提出することで、$100$ 点を得ることができる。

#include <bits/stdc++.h>
using namespace std;

int main() {
  int H, W;
  cin >> H >> W;
  vector<string> S(H);
  for(int i = 0; i < H; i++) {
    cin >> S[i];
  }
  int ri = -1, rj = -1;
  for(int i = 0; i < H; i++) {
    for(int j = 0; j < W; j++) {
      if(S[i][j] == 'R') {
        ri = i;
        rj = j;
        break;
      }
    }
  }
  vector<vector<bool>> visited(H, vector<bool>(W, false));
  bool finished = false;
  while(!visited[ri][rj]) {
    visited[ri][rj] = true;
    ri++;
    if(ri == H) {
      ri = 0;
    }
    rj++;
    if(rj == W) {
      rj = 0;
    }
    if(S[ri][rj] == '#') {
      finished = true;
      break;
    }
  }
  if(finished) {
    ri--;
    if(ri == -1) {
      ri = H - 1;
    }
    rj--;
    if(rj == -1) {
      rj = W - 1;
    }
    cout << ri + 1 << " " << rj + 1 << endl;
  }
  else {
    cout << "loop" << endl;
  }
}

サンプル

サンプル1
入力
4 4
..R#
#.#.
....
##..
出力
3 1

ロボットははじめ、$(1, 3)$ に置かれています。その後、操作によって、$(2, 4), (3, 1)$ と動き、$(4, 2)$ の障害物マスのため操作が行えなくなります。
よって、最終的にロボットが置かれているマスである $(3, 1)$ を空白区切りで出力してください。

サンプル2
入力
3 3
...
.R.
...
出力
loop

ロボットは、$(2, 2), (3, 3), (1, 1), (2, 2), (3, 3), \ldots$ と動き、操作が終わることはありません。
よって、loop を出力してください。

サンプル3
入力
15 39
........######...#####.....####........
........#.##.R..##...##...##..##.......
..........##....#........##............
..........##.....#####...##............
..........##.........##..##..###.......
..........##....##...##...##..##.......
.........####....#####.....#####.......
.......................................
.####.....####..##...##..#######...##..
..##.......##...##...##...##...#..####.
..##.......##....##.##....##.#....####.
..##.......##....##.##....####.....##..
..##...#...##.....###.....##.#.....##..
..##..##...##.....###.....##...#.......
.#######..####.....#.....#######...##..
出力
5 17

TSG LIVE! 16 ライブコードゴルフ Day 2 は 5/17 に五月祭にて放送されます。

提出するには、Twitter 、GitHub、 Googleもしくは右上の雲マークをクリックしてアカウントを作成してください。