[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')
以上,
若有更好的想法歡迎提出哦!
若有更好的想法歡迎提出哦!
留言
張貼留言