PICNIC 문제를 C언어로 풀어보았다.
예전에 PS 처음할때는 정말 어려웠던 문제였다.
C 연습하려고 포인터를 이용해서 문제를 풀었다.
완전탐색을 이용해서 문제해결, 단 중복되는 경우를 없애야한다.
자기보다 번호가 큰 사람만을 보는 방법으로, 한 방향을 정해서 중복을 없앨 수 있었다.
<정답코드 C>
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 | #include<stdio.h> void init(int(*isfriend)[11], int* havefriend); void matching(int k, int n, int(*isfriend)[11], int* havefriend,int* sum); int main() { //freopen("input.txt", "r", stdin); int tc, sum; int t, i, n, m, f1, f2; int isfriend[11][11]; int havefriend[11]; scanf("%d", &tc); for (t = 1; t <= tc; t++) { sum = 0; init(isfriend, havefriend); scanf(" %d %d", &n, &m); for (i = 0; i < m; i++) { scanf(" %d %d", &f1, &f2); isfriend[f1][f2] = 1; isfriend[f2][f1] = 1; } matching(0, n, isfriend, havefriend, &sum); printf("%d\n", sum); } return 0; } void init(int(*isfriend)[11], int* havefriend) { int i, j; for (i = 0; i < 11; i++) for (j = 0; j < 11; j++) { isfriend[i][j] = 0; havefriend[i] = 0; } } void matching(int k, int n, int(*isfriend)[11], int* havefriend, int* sum) { int i, j; if (k == n) { for (j = 0; j < n; j++) { if (!havefriend[j]) return; } (*sum)++; return; } for (i = k + 1; i < n; i++) { if (isfriend[k][i] && !havefriend[i] && !havefriend[k]) { havefriend[i] = havefriend[k] = 1; matching(k + 1, n, isfriend, havefriend, sum); havefriend[i] = havefriend[k] = 0; } } matching(k + 1, n, isfriend, havefriend, sum); } | cs |
반응형
'알고리즘 > Algospot' 카테고리의 다른 글
CLOCKSYNC(C언어) (0) | 2018.06.28 |
---|---|
BOARDCOVER(C언어) (0) | 2018.06.27 |
28.2 문제: 고대어 사전(문제 ID: DICTIONARY) (0) | 2017.12.07 |
외발 뛰기 (문제 ID: JUMPGAME, 난이도: 하) (0) | 2017.11.13 |
6.8 문제: 시계 맞추기 (문제 ID: CLOCKSYNC, 난이도: 중) (0) | 2017.11.09 |