0
0

文字列の配列 (paizaランク C 相当)

Last updated at Posted at 2023-11-21

縦 H マス、横 W マスの H × W マスからなる迷路 S があります。上から i 行目、左から j 列目のマス は S_ij とあらわされ、 S_ij が「#」のとき壁であり、「.」のとき道です。整数 r、c が与えられるので、S_rc が壁かどうか判定してください。

一風変わった問題。

おそらくループで縦ヨコのマスを作ればいいんだとは思うが、
とりあえず1行目の各変数を格納しておいて、次の2行目がどうなるのか見てみた。

H,W,r,c = map(int,input().split())
print(input())

..#.

なんとー。半スペで区切られていないやつだった。なるほど。
ほんなら、1文字ずつスライスして配列にいれればいいんかな?
やってみましょう。
ちなみにやり方は知らんが、phpで同じことをやったことがあるので
pythonでも同じことができるのか調べてみた。

ありました。list()

for i in range(H):
    for j in range(W):
        S = input()
        print (S)

としたら、Errorが出てきた。

Traceback (most recent call last):
  File "Main.py", line 4, in <module>
    print(input())
EOFError: EOF when reading a line

調べてみると、どうやらfor文の中でinput()するとエラーになるそうだ。
で、エラー文を回避すればちゃんと取得される。。。らしい。

なので。私もPythonじゃ初めてだけどエラー処理をしてみた。

H,W,r,c = map(int,input().split())
try:

    for i in range(H):
        for j in range(W):
            S = list(input())

except EOFError:
    pass

print(S)
['.', '.', '.', '.']

とりあえずエラーが出なくなったので、これで開発?解答?を進める。
二次元配列で、A[i,j]のような感じのやつに、スライスできた
やつをいれていけば、 AのMAX値が答えになって判断が可能になるはず。
1次元配列はやったことあるけど二次元配列ってどうやっていれるんだっけ、
とまた調べる。とりあえず、2つ配列が必要だ。

H,W,r,c = map(int,input().split())
try:
    mainArr =[]
    for i in range(H):
        subArr =[]
        S = list(input())
        for j in range(W):
            subArr.append(S[j])
        mainArr.append(subArr)

except EOFError:
    pass

print(mainArr)

とりあえず作ってみたのでいったんprint.
でました〜。

[['.', '.', '#', '.'], ['#', '.', '#', '#'], ['.', '.', '.', '.']]

はいこれでよいですね。

で、mainArr[r, c]の値がいくつかでYesかNoがでると。
あれ、でも待てよ。0から始まるのだから、−1か。

H,W,r,c = map(int,input().split())
try:
    mainArr =[]
    for i in range(H):
        subArr =[]
        S = list(input())
        for j in range(W):
            subArr.append(S[j])
        mainArr.append(subArr)
    if mainArr[r-1][c-1] =='#':
        print("Yes")
    else:
        print("No")

except EOFError:
    pass

これにてできました。

答えを見てみると。

H, W, r, c = map(int, input().split())
maze = [input() for _ in range(H)]

if maze[r-1][c-1] == "#":
    print("Yes")
else:
    print("No")

まじか。
もっと簡単じゃん。
ああそうか、行だけまとめて出力されてるから、
ループは縦だけで良かったんや。。。なるほど。
ほんなら内包表記でできるなぁ。。。

あれ?文字列を配列に入れたら分割して入るのかな?

ちょっと実験

H, W, r, c = map(int, input().split())
maze=[]
for _ in range(H):
    maze.append(input())
    print(maze)

['..#.']
['..#.', '#.##']
['..#.', '#.##', '....']

あれ、文字列のままだ。
となると、

maze = ['..#.', '#.##', '....']

となっているはずなのに、なぜmaze[r-1][c-1]で取得ができるんだろう?

ひとまず、

print(maze[1])

とすると、

#.##

がでて、

print(maze[1][0])

だと1番目(コード上だと0番目)の#が出てきた。
該当する要素の●番目の数を抽出できるようだ。
色々調べてみたけどもっともらしい説明は見つからず。
そういうものかなと一応理解した。

ひとまず今日は終了

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0