[ALGOSPOT] 소풍_C언어

SW 업무 관련/SW Expert Academy

[ALGOSPOT] 소풍_C언어

WillBe_ 2017. 8. 21. 20:29

https://algospot.com/judge/problem/read/PICNIC



풀이

배열의 순서와 관련된??문제는 왜이렇게 어렵게 느껴지는지 모르겠다.


문제에서 두개의 쌍으로 묶어서 나오는 탐색 문제는 인접 배열로 풀어야 된다!!

인접 배열은 두 값이 쌍으로 묶어질 때 두 값을 축으로하는 2차원 배열로 해당 배열의 위치를 표시해주는 것이다.


문제에서 다음과 같은 짝궁들의 배열이 주어지면

0 1 1 2 2 3 3 0 0 2 1 3 


//짝 입력

for (int i = 0; i < m; i++)

{

int a, b;

scanf("%d %d", &a, &b);

index[a][b] = index[b][a] = 1;

}

와 같이 배열에 서로가 관련이 있다고 표시해주는 것이다.


그후 탐색을 통해 짝인 경우의 수를 카운트 해주면 된다.


여기서 중요한건 (0,1), (1,0)이 중복으로 카운트되는 것과, (0,1)(2,3)  /  (2,3) (0,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
#include <stdio.h>
#include <string.h>
int T, n, m, num, arr[11], index[11][11];
 
int search(int * a)
{
    int flag = -1;//아직 짝궁이 없는 가장 빠른 인덱스를 찾기 위해
    for (int i = 0; i < n; i++)
    {
        if (a[i]!=1)//짝궁이 없으면 종료
        {
            flag = i;
            break;
        }
    }
    if (flag == -1)//전부 짝궁이 있으면 return
        return 1;
 
    int num = 0;//이게 없으면 중복으로 더해져서 값이 이상해짐.
 
    for (int i = flag; i < n; i++)
    {
        if (a[i])//짝궁이 있으면 점프~
            continue;
 
            if (index[i][flag] == 1 || index[flag][i] == 1)//짝궁인지 체크
            {
                a[i] = a[flag] = 1;//짝궁이 정해짐
                num += search(a);
                a[i] = a[flag] = 0;//다은 짝궁을 정하기 위해 초기화
            }
    }
    return num;
}
 
int main()
{
    scanf("%d",&T);
    while (T--)
    {
        //초기화
        int a[11= {0, };
        num = 0;
        memset(a, 0sizeof(a));
        memset(arr, 0sizeof(arr));
        memset(index, 0sizeof(index));
        
        //m,n입력
        scanf("%d %d"&n, &m);
 
        //짝 입력
        for (int i = 0; i < m; i++)
        {
            int a, b;
            scanf("%d %d"&a, &b);
            index[a][b] = index[b][a] = 1;
        }
        //출력
        printf("%d\n",search(a));
    }
    return 0;
}
cs