結果
問題 | No.401 数字の渦巻き |
ユーザー | @abcde |
提出日時 | 2019-02-20 22:21:28 |
言語 | C++11 (gcc 11.4.0) |
結果 |
AC
|
実行時間 | 2 ms / 2,000 ms |
コード長 | 2,382 bytes |
コンパイル時間 | 2,000 ms |
コンパイル使用メモリ | 161,144 KB |
実行使用メモリ | 5,248 KB |
最終ジャッジ日時 | 2024-11-07 19:35:20 |
合計ジャッジ時間 | 2,964 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,248 KB |
testcase_02 | AC | 2 ms
5,248 KB |
testcase_03 | AC | 2 ms
5,248 KB |
testcase_04 | AC | 2 ms
5,248 KB |
testcase_05 | AC | 1 ms
5,248 KB |
testcase_06 | AC | 2 ms
5,248 KB |
testcase_07 | AC | 2 ms
5,248 KB |
testcase_08 | AC | 2 ms
5,248 KB |
testcase_09 | AC | 1 ms
5,248 KB |
testcase_10 | AC | 1 ms
5,248 KB |
testcase_11 | AC | 2 ms
5,248 KB |
testcase_12 | AC | 1 ms
5,248 KB |
testcase_13 | AC | 1 ms
5,248 KB |
testcase_14 | AC | 2 ms
5,248 KB |
testcase_15 | AC | 2 ms
5,248 KB |
testcase_16 | AC | 2 ms
5,248 KB |
testcase_17 | AC | 2 ms
5,248 KB |
testcase_18 | AC | 2 ms
5,248 KB |
testcase_19 | AC | 2 ms
5,248 KB |
testcase_20 | AC | 2 ms
5,248 KB |
testcase_21 | AC | 2 ms
5,248 KB |
testcase_22 | AC | 2 ms
5,248 KB |
testcase_23 | AC | 1 ms
5,248 KB |
testcase_24 | AC | 2 ms
5,248 KB |
testcase_25 | AC | 2 ms
5,248 KB |
testcase_26 | AC | 2 ms
5,248 KB |
testcase_27 | AC | 2 ms
5,248 KB |
testcase_28 | AC | 1 ms
5,248 KB |
testcase_29 | AC | 2 ms
5,248 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; int main() { // 1. 入力情報取得. int N; cin >> N; // 2. 数字の渦巻きを作る? // ex. // N = 4 の 場合. // 4 -> 3 -> 3 -> 2 -> 2 -> 1 -> 1 // したがって, 以下のような数列をイメージすることになる. // N -> N - 1 -> N - 1 -> N - 2 -> N - 2 -> ... -> 2 -> 2 -> 1 -> 1 vector<int> v; int count = N; v.push_back(N - 1); // N だと上手く行かなかった. count--; while(count > 0) v.push_back(count), v.push_back(count), count--; // for(auto &p : v) cout << p << " " << endl; // 3. 二次元配列(r, c)成分は, 何番目? // dr, dc を使って, 右 -> 下 -> 左 -> 上 -> 右 -> ... を繰り返す方針で考える. int dr[4] = {0, 1, 0, -1}, dc[4] = {1, 0, -1, 0}; int ans[N][N]; int index = 1; ans[0][0] = index; // (前回)行, 列インデックス. int befR = 0, befC = 0; // 上下左右の向き判定フラグ. int flag = 0; for(auto &p : v){ // 3-1. (前回)行, 列インデックス. int curR = befR, curC = befC; // 3-2. 二次元配列更新. for(int i = 0; i < p; i++){ curR += dr[flag], curC += dc[flag]; ans[curR][curC] = ++index; // cout << "curR:" << curR << " curC:" << curC << " index:" << index << endl; // ex. // N = 3 の 場合. // curR:0 curC:1 index:2 // curR:0 curC:2 index:3 // curR:1 curC:2 index:4 // curR:2 curC:2 index:5 // curR:2 curC:1 index:6 // curR:2 curC:0 index:7 // curR:1 curC:0 index:8 // curR:1 curC:1 index:9 } // 3-3. flag更新. (++flag) %= 4; // cout << "flag=" << flag << endl; // 3-4. 前回分更新. befR = curR, befC = curC; } // 4. 出力. // for(int i = 0; i < N; i++) for(int j = 0; j < N; j++) cout << ans[i][j] << " "; // ex. // N = 3 の 場合. // -> 1 2 3 8 9 4 7 6 5 // string ans = ""; // cout << ans << endl; for(int i = 0; i < N; i++){ for(int j = 0; j < N; j++){ cout << setfill('0') << setw(3) << ans[i][j] << " "; } cout << endl; } return 0; }