728x90
https://www.acmicpc.net/problem/1913
1913번: 달팽이
N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서
www.acmicpc.net
홀수 자연수 N
달팽이 모양으로 채울 수 있다.
중간부터 하지 말고 처음부터(n*n 수가 들어갈 (0,0)) 값을 넣어주면서 뱅글 돌아가면 쉽다.
dx, dy를 사용해서 방향(d)에 따라서 이동할 위치를 더해주면 되는데,
조건은 n을 벗어나지 않을 것 && 이동할 위치가 0일 것.
만약 n을 벗어나거나 이동할 위치에 값이 이미 있다면(0이 아니라면) 방향을 바꿔서 이동해야 한다.
방향은 하 → 우 → 상 → 좌 으로 돌아간다.
#include <iostream>
using namespace std;
int main(){
ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
int n, m, arr[1000][1000], d = 0; //0:하, 1:우, 2:상, 3:좌
int c1, c2, x=0, y=0;
int dir[4][2] = {{1, 0}, {0, 1}, {-1, 0}, {0, -1}};
cin >> n >> m;
for(int i=n*n; i>0; i--){
arr[x][y] = i;
if(i == m) {
c1 = x+1; c2 = y+1;
}
int dx = x + dir[d][0];
int dy = y + dir[d][1];
if(dx < 0 || dx >= n || dy < 0 || dy >= n || arr[dx][dy] != 0){ //해당 방향으로 가면 범위에서 벗어나거나 값이 이미 들어간 경우
d = (d+1)%4; //방향 변경
}
x = x + dir[d][0];
y = y + dir[d][1];
}
for(int i=0; i<n; i++){
for(int j=0; j<n; j++){
cout << arr[i][j] << ' ';
}
cout << '\n';
}
cout << c1 << ' ' << c2 << '\n';
return 0;
}
사실 처음엔 못 풀 줄 알았는데 또 해보니까 된다.
너무 쉽게 포기하지 말자.
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준/c++] 11399번: ATM (0) | 2022.07.08 |
---|---|
[백준/c++] 19637번: IF문 좀 대신 써줘 (0) | 2022.07.07 |
[백준/c++] 2578번: 빙고 (0) | 2022.07.06 |
[백준/c++] 14467번: 소가 길을 건너간 이유 1 (0) | 2022.07.06 |
[백준/c++] 21918번: 전구 (0) | 2022.05.30 |