본문 바로가기
알고리즘/알고리즘 개념?부족?_

달팽이 비스무리한 것 (시뮬레이션, c++)

by kcj3054 2021. 12. 11.

달팽이 비스무리 문제

  • 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