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, 0, sizeof(a)); memset(arr, 0, sizeof(arr)); memset(index, 0, sizeof(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 |
'SW 업무 관련 > SW Expert Academy' 카테고리의 다른 글
1974. 스도쿠 검증 (0) | 2018.06.26 |
---|---|
1204. [S/W 문제해결 기본] 1일차 - 최빈수 구하기 (0) | 2018.06.24 |
[Expert Academy] 1206. [S/W 문제해결 기본] 1일차 - View (0) | 2018.06.22 |
[Expert Academy] 1226. 미로1 (0) | 2018.06.17 |
[ALGOSPOT] BOGGLE_C언어 (0) | 2017.08.18 |