백준

백준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;
}