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

# 問題
https://atcoder.jp/contests/abc375/tasks/abc375_c

## 入力例01
![25012701.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530912/300a36fc-65d5-30a9-be32-a649b749c5e2.png)


### 解法イメージ

![25012702.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530912/8d58362a-4b20-4f01-ab55-660299c4da0a.png)


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

# 既存投稿一覧ページへのリンク
[一覧ページ](https://qiita.com/o_chan_t/items/fc759695acfaef8df2cc)

## Before
[AtCoder Beginner Contest 374_E 問題](https://qiita.com/o_chan_t/items/b4f983d89c2cfd445cdd)

## Next
[AtCoder Beginner Contest 375_D 問題](https://qiita.com/o_chan_t/items/3b7883c7052cc6c2cf78)


# 解法手順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
```python: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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/530912/de173124-8594-a940-966e-c2d0989e53e5.png)