[알고리즘] 달팽이
Updated:
개요
- 달팽이 모양 숫자 출력
코드
#include <cstdio>
#include <iostream>
#include <tuple>
#include <vector>
using namespace std;
vector<int> solution(int row, int column) {
vector<int> result(row * column);
int x = 0;
int y = -1;
int move = -1;
int value = 0;
while (value != row * column) {
++move;
switch (move % 4) {
case 0:
for (int i = 0; i < column; ++i) {
if (result[x * column + y + 1] != 0) {
break;
}
result[x * column + ++y] = ++value;
if (y == column - 1) {
break;
}
}
break;
case 1:
for (int i = 0; i < row; ++i) {
if (result[(x + 1) * column + y] != 0) {
break;
}
result[++x * column + y] = ++value;
if (x == row - 1) {
break;
}
}
break;
case 2:
for (int i = 0; i < column; ++i) {
if (result[x * column + (y - 1)] != 0) {
break;
}
result[x * column + --y] = ++value;
if (y == 0) {
break;
}
}
break;
case 3:
for (int i = 0; i < row; ++i) {
if (result[(x - 1) * column + y] != 0) {
break;
}
result[--x * column + y] = ++value;
if (x == 0) {
break;
}
}
break;
default:
break;
}
}
return result;
}
int main() {
vector<tuple<int, int>> matrix = {make_tuple(0, 0), make_tuple(1, 1),
make_tuple(3, 3), make_tuple(5, 5),
make_tuple(5, 7), make_tuple(7, 5)};
for (const auto& iter : matrix) {
const int row = get<0>(iter);
const int column = get<1>(iter);
auto result = solution(row, column);
cout << "---(" << row << ", " << column << ")---" << endl;
for (int x = 0; x < row; ++x) {
for (int y = 0; y < column; ++y) {
printf("%3d ", result[x * column + y]);
}
cout << endl;
}
cout << "-----------" << endl << endl;
}
return 0;
}
결과
---(0, 0)---
-----------
---(1, 1)---
1
-----------
---(3, 3)---
1 2 3
8 9 4
7 6 5
-----------
---(5, 5)---
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
-----------
---(5, 7)---
1 2 3 4 5 6 7
20 21 22 23 24 25 8
19 32 33 34 35 26 9
18 31 30 29 28 27 10
17 16 15 14 13 12 11
-----------
---(7, 5)---
1 2 3 4 5
20 21 22 23 6
19 32 33 24 7
18 31 34 25 8
17 30 35 26 9
16 29 28 27 10
15 14 13 12 11
-----------