▼考え方
ポイントになる考え方1.~7.を以下に示します。
1.時刻t_1(=0),t_2,...,t_nと、各時刻におけるユーザーの位置情報(y,x)を、2次元リストtyxにセットします。以下に例を示します。
tyx = [[0, 0, 0], [100, 100, 100]]
2.リストtyxをもとに、題意に沿って計算した時刻とユーザの位置情報をリストuserlocationにセットします。以下に計算後の例を示します。
userlocation = [[0, 0, 0], [1, 1, 1], ...., [99, 99, 99], [100, 100, 100]]
3.各時刻におけるユーザーの位置情報を計算する処理になります。以下に概要を示します。赤文字の部分を説明しますと、リストtyxのt_i=0と3のデータから、t_i=1と2の位置情報を計算し、リストuserlocationにセットします。同様に、リストtyxのn行すべてを処理します。
4.リストtyxのt_i=0のデータを、リストuserlocationにセットします。
5.リストtyxのt_i=0と3は、3-0=3で1より大きい数値になりますので、題意よりt_i=1と2のユーザーの位置情報は、等速で直線移動したと想定して計算します。考え方5では、時間1あたりの移動量を計算します。
6.考え方5で計算した時間1あたりの移動量から、t_i=1と2のユーザーの位置情報を計算します。
題意より、座標が小数になる場合は小数点以下を切り捨てるか切り上げる必要があります。私は切り捨てを選択しました。明確な根拠はありませんが、切り上げた場合と四捨五入した場合はテストが通過しませんでした。また、意図通り切り捨てるために、int()を使用しました。
7.考え方3のfor文で、リストtyxの最後から1つ手前の行まで処理ができます。そのため、考え方7の処理で、リストtyxの最後の行をリストuserlocationにセットします。
▼コード
########## 処理0(準備) インプット,リスト定義 ###########
n = int(input())
# 考え方1.
tyx = [list(map(int,input().split(" "))) for i in range(n)]
# 考え方2.
userlocation = []
########## 処理1 各時刻におけるユーザーの位置情報を計算、出力する処理 ###########
# 考え方3.
for i in range(1,n):
# 考え方4.
userlocation.append(tyx[i-1])
# 考え方5.
t_sabun = tyx[i][0] - tyx[i-1][0]
if t_sabun > 1:
y_sabun = tyx[i][1] - tyx[i-1][1]
# y_zoubun: y軸方向の時間1あたりの移動量をセットする変数
y_zoubun = y_sabun/t_sabun
x_sabun = tyx[i][2] - tyx[i-1][2]
# x_zoubun: x軸方向の時間1あたりの移動量をセットする変数
x_zoubun = x_sabun/t_sabun
# 考え方6.
for j in range(1,t_sabun):
userlocation.append([tyx[i-1][0]+j,int(tyx[i-1][1]+(y_zoubun*j)),int(tyx[i-1][2]+(x_zoubun*j))])
# 考え方7.
userlocation.append(tyx[i])
for i in range(len(userlocation)):
print(userlocation[i][1],userlocation[i][2])