백준
백준1913 - 달팽이
개발하는꼬마
2019. 10. 3. 13:27
https://www.acmicpc.net/problem/1913
1913번: 달팽이
N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서 출력한다.
www.acmicpc.net
반시계 방향으로 또아리를 틀 듯 가장 가운데까지 1씩 줄여가며 수를 채우면 된다. 각 꼭짓점에 도달하면 움직여야 하는 방향이 달라지고 좌측 방향으로 움직일 때 이동하려는 칸에 이미 숫자가 채워 있으면 아래로 내려가야 된다.
#include <iostream>
using namespace std;
int mat[1000][1000]; //슛자가 들어갈 공간
int N; //원하는 변의 길이
int num; //입력할 숫자
int i = 1; //행 좌표
int j = 1; //열 좌표
int direction = 1; //4가지 방향 중 해당하는 방향을 표시
int what; //찾는 수
int a, b; //찾는 수의 위치
int main() {
cin >> N;
cin >> what;
num = N * N;
while (num) {
if (what == num) { //찾는 수이면 현재 위치를 기억
a = i;
b = j;
}
if (j - i == 1 && i <= (N / 2) + 1 && j - 1 != (N / 2 + 1)) { //<-방향으로 가다가 숫자를 입력해야 하는 칸에 이미 숫자가 있으면 아래로 내려간다
mat[i][j] = num;
i = i + 1;
}
else if (i == j && (N / 2 + 1) >= i) { //왼쪽 위
direction = 1; //하
mat[i][j] = num;
i = i + 1;
}
else if (i == j && (N / 2 + 1) < i) { //오른쪽 아래
direction = 2; //상
mat[i][j] = num;
i = i - 1;
}
else if (i + j == N + 1 && i > j) { //왼쪽 아래
direction = 3; //우
mat[i][j] = num;
j = j + 1;
}
else if (i + j == N + 1 && i < j) { //오른쪽 위
direction = 4; //좌
mat[i][j] = num;
j = j - 1;
}
else { //어느 특별한 공간이 아니면 정해준 방향대로 간다.
mat[i][j] = num;
if (direction == 1) {
i = i + 1;
}
if (direction == 2) {
i = i - 1;
}
if (direction == 3) {
j = j + 1;
}
if (direction == 4) {
j = j - 1;
}
}
num--; //입력할 수를 1씩 줄인다.
}
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
cout << mat[i][j] << ' ';
}
cout << '\n';
}
cout << a << ' ' << b;
}