문제
홀수인 자연수 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 |