結果
| 問題 |
No.401 数字の渦巻き
|
| コンテスト | |
| ユーザー |
@abcde
|
| 提出日時 | 2019-02-20 22:21:28 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.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 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 30 |
ソースコード
#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;
}
@abcde