백준 1913 C++

2023. 9. 29. 14:04알고리즘

 

단순 구현 문제이다. 나는 배열을 만든다음에 가운데부터 하나씩 숫자를 채워가는 식으로 문제를 풀었다.

규칙을 보고 풀면 되는 문제인데,방향을 두번 바꾼다는 점,그리고 마지막 숫자는 첫번째 방향전환에서 이뤄진다는 점을 고려해서 문제를 풀었다.

한번문제를 틀렸는데, 그 경우는 찾아야하는 숫자가 1인 경우였다. 이 부분을 고쳐서 제출해서 풀었다.

#include <iostream>

using namespace std;

int N, findNum;

int dx[4] = {0, 1, 0, -1};
int dy[4] = {-1, 0, 1, 0};
int x, y;
int arr[1000][1000];

void solve(void){
    int sx = N/2;
    int sy = N/2;
    int num = 1, dir = 0, moveCnt=1;
    if (num==findNum){
        x=sx+1, y=sy+1;
    }            
    arr[sy][sx] = num++;
    while (1){
        int wmoveCnt=moveCnt;
        while (wmoveCnt--){
            sx = sx + dx[dir];
            sy = sy + dy[dir];
            if (num==findNum){
                x=sx+1, y=sy+1;
            }
            arr[sy][sx] = num++;
            if (sy==0 && sx==0) {
            return;
        }
        }
        dir = (dir+1)%4;
        wmoveCnt=moveCnt;
        while (wmoveCnt--){
            sx = sx + dx[dir];
            sy = sy + dy[dir];
             if (num==findNum){
                x=sx+1, y=sy+1;
            }
            arr[sy][sx] = num++;
        }
        dir = (dir+1)%4;
        moveCnt++;
    }
}
int main(void){
    cin.tie(NULL);
    ios::sync_with_stdio(false);
    cin>>N>>findNum;
    solve();
    for (int i=0;i<N;i++){
        for (int j=0;j<N;j++){
            cout<<arr[i][j]<<" ";
        }
        cout<<endl;
    }
    cout<<y<<" "<<x<<endl;
    return 0;
}