第48回【Python】二点間の距離 1、二点間の距離 2
現在取り組んでいるのは、paiza ラーニング問題集「配列メニュー」になります。
はじめに
猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。
Python をゼロから勉強してみよう、のコーナー 48 回目です。
野球ブログと化した昨今、Python の記事が滞っていますが、勉強は続けています。優先順位は野球が 1 位、それ以外が 2 位以下ですが、どんなに時間が厳しくても必ず勉強だけは必ずやります。
それでは、今日も頑張ってみようと思います。
二点間の距離 1
1 行目に整数 N が与えられます。
2 行目以降に N 個の点の座標 x_1 y_1, x_2 y_2, …, x_N y_N が与えられます。
点 (2, 3) と各点の距離を改行区切りで出力してください。
距離の計算にはマンハッタン距離
|x1 - x2| + |y1 - y2|
を用いることとします。
すべてのテストケースにおいて、以下の条件をみたします。
・* N は 1 以上 10 以下の整数
・* x_i, y_i (1 ≤ i ≤ N) は 1 以上 10 以下の整数
3
2 3
1 2
5 6
マンハッタン距離。うん、よく出る問題だ。マンハッタンって本当に正方形のブロックに区分されてるん?
Python
N = int(input())
X = [0] * N
Y = [0] * N
for i in range(N):
x,y = map(int,input().split())
X[i] = x
Y[i] = y
for i in range(N):
print(abs(X[i]-2) + abs(Y[i]-3))
VBA
Dim X() As Integer, Y() As Integer
N = Cells(1, 1)
ReDim X(N)
ReDim Y(N)
For i = 0 To N - 1
XY = Split(Cells(i + 2, 1), " ")
X(i) = Val(XY(0))
Y(i) = Val(XY(1))
Next
For i = 0 To N - 1
Debug.Print Abs(X(i) - 2) + Abs(Y(i) - 3)
Next
二点間の距離 2
1 行目に整数 N, A, B が与えられます。
2 行目以降に N 個の点の座標 x_1 y_1, x_2 y_2, …, x_N y_N が与えられます。
A 番目の点 と B 番目の点の距離を出力してください。
すべてのテストケースにおいて、以下の条件をみたします。
・* N は 1 以上 10 以下の整数
・* A, B は 1 以上 N 以下の整数
・* x_i, y_i (1 ≤ i ≤ N) は 1 以上 10 以下の整数
5
9 1 5 3 7
N が 1 以上 10 以下とのことで、10 個の座標が与えられたとしても、指定の 2 つの座標の距離を出力する、という少し無駄が多い問題。ただ、結構汎用性高いような気はする。
Python
N,A,B = map(int,input().split())
X = [0] * N
Y = [0] * N
for i in range(N):
x,y = map(int,input().split())
X[i] = x
Y[i] = y
print(abs(X[A-1]-X[B-1])+abs(Y[A-1]-Y[B-1]))
VBA
Dim X() As Integer, Y() As Integer
NAB = Split(Cells(1, 1), " ")
N = Val(NAB(0))
A = Val(NAB(1))
B = Val(NAB(2))
ReDim X(N)
ReDim Y(N)
For i = 0 To N - 1
XY = Split(Cells(i + 2, 1), " ")
X(i) = Val(XY(0))
Y(i) = Val(XY(1))
Next
Debug.Print Abs(X(A - 1) - X(B - 1)) + Abs(Y(A - 1) - Y(B - 1))
最後に
マンハッタン距離ってなんだろう。いや、わかっているんだけれど。
X、Y それぞれの配列を用意するのが正しいのか、辞書型とするのが正しいのか、タプル型とするのが正しいのか、今回の問題では、それぞれを用意するのがよさそうだったけれど。もっと大量の座標が用意された場合とか、いろいろなパターンで考えてみる必要がありそう?
引き続き、よろしくお願いいたします!
ディスカッション
コメント一覧
まだ、コメントがありません