달팽이 비스무리 문제
- n * n 격자에서 숫자 1부터 우 위 좌 우 방향으로 돌아가면서 직사각형을 채우면된다. 돌아가는 형식은 백준의 소용돌이 예쁘게 문제랑 동일하다 우측에서 좌측으로 변할때마다 이동하는 횟수가 증가한다.
관련 출처 : https://www.acmicpc.net/problem/1022
헤맨 부분
소스를 막 달려서 짜다가 실행 흐름을 생각지 않고 짰었다..
실행의 흐름을 보자 일단 시작점을 잡고 -> 갈 수 있는지 체크 -> 현재 dirCnt만큼 움직이다가 하나 움직이고 바로 x, y 좌표를 갱신해야한다 -> 이후 해당 dirCnt만큼 다 움직인 이후에 direction을 변화시켜야한다 -> 변화 시킨 direction이 우측 좌측이면 dirCnt증가
- 나는 밑의 x, y갱신을 자꾸 dirCnt밖에서 해서 무한루프로 빠지는 실수를 범했다....
x += dx[direction]; y += dy[direction];
소스
// 방향이 오른쪽, 위, 왼쪽, 아래 순서로 변하게 되는데,
// 관찰을 통해 각 방향에 대해서는 처음 1씩 이동하다가,
// 방향이 왼쪽 혹은 오른쪽으로 바뀌었을 때에만 이동하는 거리가 1씩 늘어나게 됨을 알 수 있습니다.
#include <iostream>
using namespace std;
int x, y, n;
int a[200][200];
bool visit[200][200];
int dx[] = {0, -1, 0, 1};
int dy[] = {1, 0, -1, 0};
bool CanGo(int x, int y) {
return x >= 0 && x < n && y >= 0 && y < n;
}
int main() {
cin >> n;
x = n / 2;
y = n / 2;
int nx = 0;
int ny = 0;
int cnt = 1;
int direction = 0;
int dirCnt = 1;
while(true) {
//cout << x <<"," << y << endl;
if(CanGo(x, y)) {
for(int i = 0 ; i < dirCnt; i++ ) {
a[x][y] = cnt++;
x += dx[direction];
y += dy[direction];
}
direction = (direction + 1) % 4;
//- > 방향이 전환되기전에
// 현재 dirCnt안에 만큼에서는 다음 x, y좌표를 다시 만들어줘야한다
// x += dx[direction]; -> 틀린 소스 ,
// y += dy[direction];
if( (direction % 4) == 0 || (direction % 4) == 2) {
dirCnt++;
}
} else break;
}
for(int i = 0 ; i < n; i++) {
for(int j = 0 ; j < n; j++) {
cout << a[i][j] << " ";
}
cout << endl;
}
return 0;
}
'알고리즘 > 알고리즘 개념?부족?_' 카테고리의 다른 글
배열 회전, (시뮬 90도회전) (0) | 2021.12.28 |
---|---|
비트연산 - Bit Operation (0) | 2021.12.14 |
최대 최소 (0) | 2021.12.10 |