bash
1$ ./a.out 26 3[[ 1, 2, 3, 4, 5, 6 ] 4 [ 20, 21, 22, 23, 24, 7 ] 5 [ 19, 32, 33, 34, 25, 8 ] 6 [ 18, 31, 36, 35, 26, 9 ] 7 [ 17, 30, 29, 28, 27, 10 ] 8 [ 16, 15, 14, 13, 12, 11 ]]
上記のような二次元配列を作りたいのですが、皆様がどのように実装するかが知りたいです。ちなみに私は以下のように実装しました。もっと楽に書けるのではと思い質問いたしました。よければ回答お願いします。言語は何でも構いません。
あと、以下の実装で気になる点(do while
が微妙など)や、もっとこうすればいいのではといったご指摘もあれば嬉しいです。
cpp
1#include <bits/stdc++.h> 2using namespace std; 3 4int dx[] = {1, 0, -1, 0}; 5int dy[] = {0, 1, 0, -1}; 6 7int ans[1000][1000]; 8 9int main() { 10 int n; 11 cin >> n; 12 int now = 1; 13 int nx = 0, ny = 0; // 現在位置 14 int dir = 0; // 現在進もうとする方向 15 while (now <= n * n) { 16 ans[nx][ny] = now; 17 now += 1; 18 do { 19 int wx = nx + dx[dir]; 20 int wy = ny + dy[dir]; 21 // 次に進もうとする方向が範囲外なら方向を変える 22 if (wx < 0 || wx >= n || wy < 0 || wy >= n) { 23 dir = (dir + 1) % 4; 24 break; 25 } 26 // 次に進もうとする方向が既に数を代入済みなら方向を変える 27 if (ans[wx][wy] != 0) { 28 dir = (dir + 1) % 4; 29 } 30 } while (0); 31 // 次に進む 32 nx += dx[dir]; 33 ny += dy[dir]; 34 } 35 // この時点でxが縦方向、yが横方向になっているので転置させる 36 for (int i = 0; i < n; i++) { 37 for (int j = 0; j < i; j++) { 38 swap(ans[i][j], ans[j][i]); 39 } 40 } 41 // 作成が完了した二次元配列の内容を出力する 42 for (int i = 0; i < n; i++) { 43 for (int j = 0; j < n; j++) { 44 cout << ans[i][j] << (j == n - 1 ? '\n' : ' '); 45 } 46 } 47 return 0; 48}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。