[zerojudge] c292: APCS2017-0304-3數字龍捲風


題目連結:


題意:
給定一個 $N \ * \ N$ 的二維陣列,
從正中間那一格開始,
朝著周圍逆時針旋轉並輸出,
直到出界為止。


解題策略:
藉由觀察移動步數,
從範例一來看,
移動步數為:左$1$、上$1$、右$2$、下$2$、左$3$、上$3$ … ,
藉由此想法,
可以輕易的解出這題。


程式碼參考:
$C++$:
$JUDGE\_RESULT$:$AC \ (3ms, \ 372KB)$
#include <iostream>
#include <vector>
#define _ ios::sync_with_stdio(false), cin.tie(nullptr);
#define endl '\n'
using namespace std;

template <typename T1, typename T2>
pair<T1, T2> operator+(pair<T1, T2> p1, pair<T1, T2> p2) { // pair 運算子 +
    return {p1.first + p2.first, p1.second + p2.second};
}

template <typename T1, typename T2>
pair<T1, T2> operator+=(pair<T1, T2>& p1, pair<T1, T2> p2) { // pair 運算子 +=
    return p1 = p1 + p2;
}

int main() { _
    int n, opt;
    cin >> n;
    cin >> opt;
    vector<vector<int>> v(n, vector<int>(n));
    for (auto& i : v)
        for (auto& j : i)
            cin >> j;
    int limit = n * n, cnt = 0;
    // limit 是走完整個二維陣列所需的總步數
    // cnt 計算目前走了幾步
    vector<pair<int, int>> move({{ -1, 0}, {0, -1}, {1, 0}, {0, 1}}); // 左, 上, 右, 下移動
    pair<int, int> cur({n / 2, n / 2}); // 正中間
    for (int movecnt = 1; cnt != limit; movecnt++) {
        for (int i = 0; i < 2; i++, opt = (opt + 1) % 4) {
            for (int j = 0; j < movecnt; j++) {
                if (cnt == limit) // 已經走完了
                    break;
                cout << v[cur.second][cur.first];
                cur += move[opt]; // 移動當前格子
                cnt++; // 步數 + 1
            }
        }
    }
    cout << endl;
}

$PYTHON$:
$JUDGE\_RESULT$:$AC \ (28ms, \ 3.4MB)$
from sys import stdin, stdout

def add(tp1, tp2): # tuple 加法運算
    return (tp1[0] + tp2[0], tp1[1] + tp2[1])

n = int(stdin.readline().strip())
opt = int(stdin.readline().strip())
f = [stdin.readline().strip().split() for _ in range(n)]
limit, cnt = n * n, 0
'''
limit 是走完整個二維陣列所需的總步數
cnt 計算目前走了幾步
'''
move = [(-1, 0), (0, -1), (1, 0), (0, 1)] # 左, 上, 右, 下移動
cur = (n // 2, n // 2) # 正中間
ans = ''
movecnt = 1
while cnt != limit:
    for i in range(2):
        for j in range(movecnt):
            if cnt == limit: # 已經走完了
                break
            ans += f[cur[1]][cur[0]]
            cur = add(cur, move[opt]) # 移動當前格子
            cnt += 1 # 步數 + 1
        opt = (opt + 1) % 4
    movecnt += 1
stdout.write(ans + '\n')



以上,
若有更好的想法歡迎提出哦!

留言

熱門文章