問題
入力例01
解法イメージ
外側から順番に時計回りに90度回転させた図形を求めよっていう面白い問題
既存投稿一覧ページへのリンク
解法手順1
-
入力されたN×Nのグリッドを2次元配列として読み込む。
-
結果を格納するための新しいN×Nのグリッドを初期化する。
-
グリッドの外側から内側に向かって、各層を処理する。
- 処理する層の数は(N+1)//2となる。
-
各層について、以下の4辺を順に処理する:
- 上辺(左から右)
- 右辺(上から下)
- 下辺(右から左)
- 左辺(下から上)
-
各辺の要素について、層番号に応じた回転を適用する:
- 層番号 % 4 == 0 の場合:90度回転
- 層番号 % 4 == 1 の場合:180度回転
- 層番号 % 4 == 2 の場合:270度回転
- 層番号 % 4 == 3 の場合:回転なし
-
回転後の位置を計算し、元のグリッドの値を新しいグリッドの対応する位置に配置する。
-
すべての層の処理が完了したら、新しいグリッドを出力する。
ACコード1
ac.py
def rotate_90(x, y, r, c):
# 90度回転の座標変換
return y, r - 1 - x
def rotate_180(x, y, r, c):
# 180度回転の座標変換
return r - 1 - x, c - 1 - y
def rotate_270(x, y, r, c):
# 270度回転の座標変換
return c - 1 - y, x
def rotate(x, y, r, c):
# 回転なしの場合(そのまま返す)
return x, y
def io_func():
# 入力処理
n = int(input()) # グリッドのサイズを入力
matrix = [list(input()) for _ in range(n)] # N×Nのグリッドを入力
return n, matrix
def solve(n, matrix):
rows, cols = n, n # 行数と列数
# 結果を格納する新しいグリッドを初期化
grid = [["." for _ in range(cols)] for _ in range(rows)]
# 各層を処理
for layer in range((rows + 1) // 2):
# 上辺を処理(左から右)
for col in range(layer, cols - layer):
if layer % 4 == 0:
x, y = rotate_90(layer, col, rows, cols)
elif layer % 4 == 1:
x, y = rotate_180(layer, col, rows, cols)
elif layer % 4 == 2:
x, y = rotate_270(layer, col, rows, cols)
else:
x, y = rotate(layer, col, rows, cols)
grid[x][y] = matrix[layer][col]
# 右辺を処理(上から下)
for row in range(layer + 1, rows - layer):
if layer % 4 == 0:
x, y = rotate_90(row, cols - 1 - layer, rows, cols)
elif layer % 4 == 1:
x, y = rotate_180(row, cols - 1 - layer, rows, cols)
elif layer % 4 == 2:
x, y = rotate_270(row, cols - 1 - layer, rows, cols)
else:
x, y = rotate(row, cols - 1 - layer, rows, cols)
grid[x][y] = matrix[row][cols - 1 - layer]
# 下辺を処理(右から左)
for col in range(cols - layer - 2, layer - 1, -1):
if layer % 4 == 0:
x, y = rotate_90(rows - 1 - layer, col, rows, cols)
elif layer % 4 == 1:
x, y = rotate_180(rows - 1 - layer, col, rows, cols)
elif layer % 4 == 2:
x, y = rotate_270(rows - 1 - layer, col, rows, cols)
else:
x, y = rotate(rows - 1 - layer, col, rows, cols)
grid[x][y] = matrix[rows - 1 - layer][col]
# 左辺を処理(下から上)
for row in range(rows - layer - 2, layer, -1):
if layer % 4 == 0:
x, y = rotate_90(row, layer, rows, cols)
elif layer % 4 == 1:
x, y = rotate_180(row, layer, rows, cols)
elif layer % 4 == 2:
x, y = rotate_270(row, layer, rows, cols)
else:
x, y = rotate(row, layer, rows, cols)
grid[x][y] = matrix[row][layer]
# 回転後のグリッドを出力
for row in grid:
print("".join(row))
# メイン処理
n, matrix = io_func()
solve(n, matrix)
###
# - n: グリッドのサイズ(N×N)
# - matrix: 入力されたグリッド
# - grid: 回転後のグリッド
# - layer: 現在処理している層の番号
# - rows, cols: グリッドの行数と列数
# - x, y: 回転後の座標
# 1. 回転関数の定義:
# - rotate_90: 90度回転の座標変換
# - rotate_180: 180度回転の座標変換
# - rotate_270: 270度回転の座標変換
# - rotate: 回転なしの座標変換
# 2. 入力処理関数 (io_func):
# - グリッドのサイズNを入力
# - N×Nのグリッドを入力
# - 入力されたデータを返す
# 3. メイン処理関数 (solve):
# - 新しいグリッドを初期化
# - 各層を外側から内側に向かって処理:
# - 上辺、右辺、下辺、左辺の順に要素を処理
# - 層番号に応じて適切な回転を適用
# - 回転後の座標を計算し、新しいグリッドに要素を配置
# - 回転後のグリッドを出力
# 4. メイン処理:
# - io_func関数で入力を受け取る
# - solve関数でグリッドの回転処理を実行
入力例03
回転させるとABC 375が出現。こういう遊びが好きだし、QRコードの迷彩とかに使えそうな問題なので、今度遊んでみよう。