본문 바로가기

PS/BaekJoon

[백준/c++] 1913 달팽이

문제

홀수인 자연수 N이 주어지면, 다음과 같이 1부터 N2까지의 자연수를 달팽이 모양으로 N×N의 표에 채울 수 있다.

9 2 3
8 1 4
7 6 5
25 10 11 12 13
24 9 2 3 14
23 8 1 4 15
22 7 6 5 16
21 20 19 18 17

N이 주어졌을 때, 이러한 표를 출력하는 프로그램을 작성하시오. 또한 N2 이하의 자연수가 하나 주어졌을 때, 그 좌표도 함께 출력하시오. 예를 들어 N=5인 경우 6의 좌표는 (4,3)이다.

입력

첫째 줄에 홀수인 자연수 N(3 ≤ N ≤ 999)이 주어진다. 둘째 줄에는 위치를 찾고자 하는 N2 이하의 자연수가 하나 주어진다.

출력

N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서 출력한다.

구현해야 할 조건

제일 큰수부터 시작한다는 점, (0,0)부터 (n-1,n-1) 까지 돌아 들어간다는 점을 기억하면 문제를 해결할 수 있을것입니다.

code

#include<iostream>

#define MAX 1001
using namespace std;

const int dx[4] = {0,1,0,-1};
const int dy[4] = {1,0,-1,0};

int n,m,dir,resY,resX,y,x;
int board[MAX][MAX];

int main()
{
	cin >> n >> m;
	
	for(int i = n*n; i > 0; i--)
	{
		board[y][x] = i;
		if(i == m)
		{
			resY = y + 1;
			resX = x + 1;
		}
		if(y + dy[dir] < 0 || y + dy[dir] >= n || x + dx[dir] < 0 || x + dx[dir] >= n || board[y + dy[dir]][x + dx[dir]] != 0)
		{
			dir = (dir + 1) % 4;
		}
		
		y = y + dy[dir];
		x = x + dx[dir];
	}
	
	for(int i = 0; i < n; i++)
	{
		for(int j = 0; j < n; j++)
		{
			cout << board[i][j] << " ";
		}
		cout << "\n";
	}
	
	cout << resY << " " << resX << "\n";
	return 0;
}

'PS > BaekJoon' 카테고리의 다른 글

[백준/c++] 기적의 매매법  (0) 2022.03.30
[백준/c++] 1952 달팽이2  (0) 2022.03.24
[백준/c++] 14225 부분수열의 합  (0) 2022.03.23
[백준/c++] 16967 배열 복원하기  (0) 2022.03.22
[백준/c++] 16917 양념 반 후라이드 반  (0) 2022.03.17