はじめに
先日に引き続き、ロジックサマナーのゲームを進めました。早く全部解けるぐらいになりたいです。
今回は、ランクCではなくランクBに挑戦しました。以前の「圧縮」よりは簡単に出来ました。よかったです。
今回もまた、正答したソースコードを以下に載せてます。
問題の概要
問題です。
問題の概要と説明は、はてなブログでpaizaの倉内さんが説明してくださっているので、そちらを参照してください。
正答したソースコード
N = int(input()) # 何次元配列(lsit)
ary_lst = [] # 入力される表をリスト化
for _ in range(N):
a_list = list(map(int, input().split()))
ary_lst.append(a_list)
# 縦横斜めで最大となる値が指標(今回横で見る)
goal = 0 # 縦横斜めで最大となる値
total = 0 # 縦横斜めのそれぞれの総和
target = [] # 0がある位置
for i in range(N): # 横
total = sum(ary_lst[i])
if (goal < total):
goal = total
for j in range(N): # 縦
if (ary_lst[i][j] == 0):
target.append((i, j)) # 穴があった箇所をリストで管理
# 穴の並び方で処理を分ける
if (target[0][1] == target[1][1]): # 縦に0が並んでいる状態
for k in range(2):
(i, j) = target[k]
ary_lst[i][j] = goal - sum(ary_lst[i])
else :
for k in range(2):
(i, j) = target[k]
total = 0
for l in range(N):
total += ary_lst[l][j]
ary_lst[i][j] = goal - total
# 出力
for i in range(N):
for j in range(N):
if (j == N - 1):
print(ary_lst[i][j])
else :
print(ary_lst[i][j], end=" ")
問題の解き方
実際に私が解いた方法を簡単にまとめていきます。
6 | 1 | 8 |
---|---|---|
7 | 5 | 3 |
2 |
上記の表が入力例として問題の方にあると思います。
この表は縦横斜めのそれぞれに対して和が15になります。
つまり、縦横斜めのそれぞれの和が同じ値になるということです。
問題の制約として、3x3以上の表と穴が2つしかないため、縦横斜めのいずれか2つを見れば解けます。
私は横と縦を見ました。斜めは少し面倒なので。
あとは、縦横で穴が1つになる並び方を選んで、最大値との差を取ると、穴の値が判明する。
その値を元のリストに加えてあげて、それを出力する。
終わりに
書いてて思った(見た)のですが、上記の参照元のpaizaの倉内さんが答えまで書いてますね…
アウトプットは大事って言いますし、このまま投稿しちゃいます。笑
以上、一つの解答例でした。