새소식

코딩테스트/백준_실버

[C++][백준 1913] 달팽이

  • -

[문제]

https://www.acmicpc.net/problem/1913

 

1913번: 달팽이

N개의 줄에 걸쳐 표를 출력한다. 각 줄에 N개의 자연수를 한 칸씩 띄어서 출력하면 되며, 자릿수를 맞출 필요가 없다. N+1번째 줄에는 입력받은 자연수의 좌표를 나타내는 두 정수를 한 칸 띄어서

www.acmicpc.net

[문제 풀이]

n/2, n/2 를 중심으로 두고 위 / 우측 / 아래 / 좌측으로 1, 1, 2, 2, 3, 3,.... 씩 돌아가는 함수를 만들자.

숫자 k를 이용해서 1,2,3씩의 거리를 조절했고 만약 위로 올라가는데 해당 거리가 n-1이면 종료가 되게 만들었다.

단순한 구현문제이긴 한데 함수의 꼬리를 함수가 무는 재귀같은 방식은 단순 반복문보다 시간이 오래 걸리게 되므로 앞으로는 주의하도록 하자.

 

[코드]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include<iostream>
#define endl "\n"
 
using namespace std;
 
int snail[1001][1001];
 
int n;
 
void upside(int x,int y,int k);
void rightside(int x,int y,int k);
void leftside(int x,int y,int k);
void downside(int x,int y,int k);
 
void upside(int x,int y,int k){
 
    if(k == n-1){
        for(int i = 0;i<k;i++){
        int temp = x-1;
        snail[temp][y] = snail[x][y] + 1;
        x = temp;
        }
        return;
    }
 
    for(int i = 0;i<k;i++){
        int temp = x-1;
        snail[temp][y] = snail[x][y] + 1;
        x = temp;
    }
    rightside(x,y,k);
    return;
}
void rightside(int x,int y, int k){
    for(int i = 0;i<k;i++){
        int temp = y+1;
        snail[x][temp] = snail[x][y] + 1;
        y = temp;
    }
    downside(x,y,k+1);
    return;
}
void downside(int x, int y, int k){
    for(int i = 0;i<k;i++){
        int temp = x+1;
        snail[temp][y] = snail[x][y] +1;
        x = temp;
    }
    leftside(x,y,k);
    return;
}
void leftside(int x, int y, int k){
    for(int i = 0;i<k;i++){
        int temp = y-1;
        snail[x][temp] = snail[x][y] +1;
        y = temp;
    }
    if(k == n-1){
        upside(x,y,k);
        return;
    }
 
    upside(x,y,k+1);
    return;
}
 
void solve(){
    int temp = n/2;
    snail[temp][temp] = 1;
 
    upside(temp,temp,1);
    return;
}
 
int main(){
    int m;
    cin>>n>>m;
    solve();
 
    pair<int,int> result;
 
    for(int i = 0;i<n;i++){
        for(int j = 0; j <n;j++){
            cout<<snail[i][j]<<" ";
            if(snail[i][j] == m){
                result.first = i+1;
                result.second = j+1;
            }
        }
        cout<<endl;
    }
    cout<<result.first<<" "<<result.second<<endl;
 
    return 0;
}
cs
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.