SWExpertAcademy의 콩 많이 심기(4301 / D4) 문제이다.


[ 문제풀이 ]

1) 문제에서 제시한 길이인 '2'는, 다음과 같은 좌표간의 관계이다.

   (x, y)가 현재 좌표라고 가정한다면, 상하좌우로 -2, + 2씩 움직인 좌표들이 제시한 길이인 '2'에 해당하는 좌표들이다.

  

   현재 파랑점에 콩이 있다면, 'A', 'B', 'C', 'D'에 해당하는 좌표들에는 콩을 심지 못한다는 의미이다.

   본인은 맵의 처음부터 끝까지 탐색하면서, 현재좌표에서 위에서 말한 좌표들에 콩이 심어져 있는지를 체크해보고,

   없으면 콩을 심는 방식으로 구현을 하였다.


[ 소스코드 ]

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
#include<iostream>
#include<cstring>
 
#define endl "\n"
#define MAX 1000
using namespace std;
 
int N, M, Answer;
bool MAP[MAX][MAX];
 
int dx[] = { 002-2 };
int dy[] = { 2-200 };
 
void Initialize()
{
    Answer = 0;
    memset(MAP, falsesizeof(MAP));
}
 
void Input()
{
    cin >> N >> M;
}
 
bool Check(int x, int y)
{
    for (int i = 0; i < 4; i++)
    {
        int nx = x + dx[i];
        int ny = y + dy[i];
        if (nx >= 0 && ny >= 0 && nx < N && ny < M)
        {
            if (MAP[nx][ny] == truereturn false;
        }
    }
    return true;
}
 
void Solution()
{
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++)
        {
            if (Check(i, j) == true)
            {
                MAP[i][j] = true;
                Answer++;
            }
        }
    }
}
 
void Solve()
{
    int Tc; cin >> Tc;
    for (int T = 1; T <= Tc; T++)
    {
        Initialize();
        Input();
        Solution();
 
        cout << "#" << T << " " << Answer << endl;
    }
}
 
int main(void)
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
 
    //freopen("Input.txt", "r", stdin);
    Solve();
 
    return 0;
}
cs


+ Recent posts