728x90
SMALL
https://www.acmicpc.net/problem/1913
1913번: 달팽이
N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서
www.acmicpc.net
정-직하게 2차원 배열의 가운데부터 1씩 증가하며
달팽이 모양(상, 우, 하, 좌) 순으로 2차원 배열을 탐색했다.
내가 이미 채운 곳이라면 (이미 어떤 cnt라는 정수가 채워져 0이 아니라면)
왔던 방향을 한번 더 가면된다.
이는 곧 현재의 방향을 나타내는 iterator i를 2 감소하면 된다.
1을 감소하면 되는게 맞지만,
현재 내가 수행한 반복문의 끝에서 1이 증가하므로 그것까지 고려해 2를 감소한다.
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, 1, 0, -1};
int main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int N, M;
cin >> N >> M;
vector<vector<int>> v(N, vector<int>(N, 0));
int x = (N - 1) / 2;
int y = x;
int cnt = 1;
v[x][y] = cnt++;
while (cnt <= N*N) {
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (nx < 0 || nx >= N || ny < 0 || ny >= N) {
continue;
}
if (v[nx][ny] != 0) {
if (i == 0) i = 2;
else if (i == 1) i = 3;
else i-=2;
}
else {
v[nx][ny] = cnt++;
x = nx; y = ny;
}
}
}
int ans_x, ans_y;
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
cout << v[i][j] << " ";
if (v[i][j] == M) {
ans_x = i+1; ans_y = j+1;
}
}
cout << endl;
}
cout << ans_x << " " << ans_y;
return 0;
}
728x90
LIST
'PS > BOJ' 카테고리의 다른 글
백준 1389 (python) 케빈 베이컨의 6단계 법칙 (2) | 2022.08.29 |
---|---|
왜 안풀림 (4) | 2022.08.15 |
백준 2468 (C++) 안전 영역 (0) | 2022.03.20 |
백준 14442 (C++) 벽 부수고 이동하기 2 (2) | 2022.03.18 |
백준 2644 (C++) 촌수계산 (2) | 2022.03.12 |