본문 바로가기

PS/BaekJoon

[백준/c++] 1952 달팽이2

문제

M줄 N칸으로 되어 있는 표 위에, 달팽이 모양으로 선을 그리려고 한다.

   
     
     
     
     

위의 그림은 M=5, N=3의 예이다. 이제 표의 왼쪽 위 칸(ㅇ)에서 시작하여, 오른쪽으로 선을 그려 나간다. 표의 바깥 또는 이미 그려진 칸에 닿아서 더 이상 이동할 수 없게 되면, 시계방향으로 선을 꺾어서 그려나간다.

위의 표는 선을 그려 나간 모양을 나타낸 것이다. 선이 꺾어진 부분은 대각선으로 나타내었다. 표의 모든 칸이 채워질 때까지, 선을 몇 번 꺾게 될까?

입력

첫째 줄에 M과 N이 빈 칸을 사이에 두고 주어진다. (2 ≤ M, N ≤ 100)

출력

첫째 줄에 표의 모든 칸이 채워질 때까지 선이 꺾어지는 횟수를 출력한다.

구현해야 할 조건

꺾여지는 부분을 체크하려면 범위를 벗어나기전, 이미 체크된 부분을 카운트하면 됩니다!

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++] 기적의 매매법  (0) 2022.03.30
[백준/c++] 1913 달팽이  (0) 2022.03.24
[백준/c++] 14225 부분수열의 합  (0) 2022.03.23
[백준/c++] 16967 배열 복원하기  (0) 2022.03.22