AtCoder

ABC364 B問題(Grid Walk)を解く

AtCoder_ABC364_B

AtCoder が提供しているABC(AtCoder Beginner Contest)364 B問題をC++とPythonで解いてみました。ABC364は、2024年7月27日21:00に実施されました。

AtCoder の紹介はこちらに、プログラミングの方針はこちらに記事があります。

B問題 Grid Walk(Difficulty : 79)

問題の詳細は、リンク先をご覧ください。

ABC364 B問題 Grid Walk

グリッドの移動を正確に実装するだけです。AtCoder Problems による Difficulty は 79 でした。

解答案

C++ プログラム例(ABC364B)

文字列 $X$ の文字 ‘L’、’R’、’U’、’D’ に従いグリッドの移動をします。移動先がグリッドの範囲内であり、空きマスであることを確認します。

以下が、C++プログラムです。

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

int main()
{
	int h, w;
	cin >> h >> w;
	int si, sj;
	cin >> si >> sj;
	--si;
	--sj;
	vector<string> c(h);
	for (int i = 0; i < h; ++i) {
		cin >> c[i];
	}
	string x;
	cin >> x;

	for (int i = 0; i < x.length(); ++i) {
		if (x[i] == 'L') {
			if ((sj - 1 >= 0)&&(c[si][sj - 1] == '.')) {
				--sj;
			}
		}
		if (x[i] == 'R') {
			if ((sj + 1 < w)&&(c[si][sj + 1] == '.')) {
				++sj;
			}
		}
		if (x[i] == 'U') {
			if ((si - 1 > 0)&&(c[si - 1][sj] == '.')) {
				--si;
			}
		}
		if (x[i] == 'D') {
			if ((si + 1 < h)&&(c[si + 1][sj] == '.')) {
				++si;
			}
		}
	}

	cout << si + 1 << " " << sj + 1 << endl;

	return 0;
}

AC(Accepted=正しいプログラム)と判定されました。

Python プログラム例(ABC364B)

Python版も基本的な考え方は同じです。以下がプログラムです。

"""AtCoder Beginner Contest 364 B"""
h, w = map(int, input().split())
si, sj = map(int, input().split())
si -= 1
sj -= 1
c = [input() for i in range(h)]
x = input()

for _, ch in enumerate(x):
    if ch == 'L':
        if sj - 1 >= 0 and c[si][sj - 1] == '.':
            sj -= 1
    if ch == 'R':
        if sj + 1 < w and c[si][sj + 1] == '.':
            sj += 1
    if ch == 'U':
        if si - 1 >= 0 and c[si - 1][sj] == '.':
            si -= 1
    if ch == 'D':
        if si + 1 < h and c[si + 1][sj] == '.':
            si += 1

print(si + 1, sj + 1)

こちらも「AC」と判定されました。

最後に

B問題としては、少し長めのプログラムかもしれません。

引き続き ABC の問題を紹介していきます。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA