0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【競技プログラミング】AtCoder Beginner Contest 375_C問題

Last updated at Posted at 2025-01-27

問題

入力例01

25012701.png

解法イメージ

25012702.png

外側から順番に時計回りに90度回転させた図形を求めよっていう面白い問題

既存投稿一覧ページへのリンク

一覧ページ

解法手順1

  1. 入力されたN×Nのグリッドを2次元配列として読み込む。

  2. 結果を格納するための新しいN×Nのグリッドを初期化する。

  3. グリッドの外側から内側に向かって、各層を処理する。

    • 処理する層の数は(N+1)//2となる。
  4. 各層について、以下の4辺を順に処理する:

    • 上辺(左から右)
    • 右辺(上から下)
    • 下辺(右から左)
    • 左辺(下から上)
  5. 各辺の要素について、層番号に応じた回転を適用する:

    • 層番号 % 4 == 0 の場合:90度回転
    • 層番号 % 4 == 1 の場合:180度回転
    • 層番号 % 4 == 2 の場合:270度回転
    • 層番号 % 4 == 3 の場合:回転なし
  6. 回転後の位置を計算し、元のグリッドの値を新しいグリッドの対応する位置に配置する。

  7. すべての層の処理が完了したら、新しいグリッドを出力する。

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コードの迷彩とかに使えそうな問題なので、今度遊んでみよう。

base_image.create_20250127224730.png

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?