LoginSignup
0
0

More than 1 year has passed since last update.

ロジックサマナー ランクB「魔法陣」を解いた

Last updated at Posted at 2022-02-28

はじめに

先日に引き続き、ロジックサマナーのゲームを進めました。早く全部解けるぐらいになりたいです。
今回は、ランク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の倉内さんが答えまで書いてますね…
アウトプットは大事って言いますし、このまま投稿しちゃいます。笑

以上、一つの解答例でした。

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