문제
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 |