λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Algorithm/AOJ

[AOJ] PICNIC

[ALGOSPOT Online Judge(AOJ)] PICNIC C++

문제 : AOJ PICNIC

문제 μ„€λͺ…

n λͺ…μ˜ 학생이 주어지고, m 개의 κ°€λŠ₯ν•œ 짝의 μˆ˜κ°€ μ£Όμ–΄μ§‘λ‹ˆλ‹€.

m 개둜 주어진 쑰건에 맞게 짝을 지을 수 μžˆλŠ” λͺ¨λ“  경우의 수λ₯Ό κ΅¬ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

κ°€λŠ₯ν•˜λ‹€κ³  주어지지 μ•Šμ€ 학생듀 끼린 짝이 될 수 μ—†κ³ , λͺ¨λ“  학생듀은 각자의 짝이 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.


Solution

μ™„μ „ 탐색

ν•™μƒμ˜ μˆ˜κ°€ μ΅œλŒ€ 10λͺ…μœΌλ‘œ μ™„μ „ νƒμƒ‰μœΌλ‘œ λͺ¨λ“  경우의 수λ₯Ό ν™•μΈν•˜μ—¬ ν’€ 수 μžˆμŠ΅λ‹ˆλ‹€.

μ΅œμ•…μ˜ 경우 μ΅œλŒ€ 학생 수 10λͺ…이 μžμ‹ μ„ μ œμ™Έν•œ 9λͺ…κ³Ό λͺ¨λ‘ 짝이 될 수 μžˆλŠ” 경우인데, 이 κ²½μš°λŠ” 9*7*5*3*1μ΄λ―€λ‘œ μ‹œκ°„μ œν•œ μ•ˆμ— ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

ν•΄λ‹Ή 학생이 짝을 μ°Ύμ•˜λŠ”μ§€μ˜ 유무인 isFind 배열을 λ§Œλ“€μ–΄ 이 λ°°μ—΄λ‘œ μž¬κ·€λ₯Ό 계속 돌며 κ²°κ³Όλ₯Ό 확인해 μ£ΌλŠ” λ°©μ‹μœΌλ‘œ ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.


Description

  • ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€μ˜ 수인 cκ°€ μ£Όμ–΄μ§€λ―€λ‘œ, μƒˆλ‘œμš΄ ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ§ˆλ‹€ μ΄ˆκΈ°ν™”λ₯Ό ν•΄μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • <string.h>의 memset() ν•¨μˆ˜λ₯Ό 톡해 ν…ŒμŠ€νŠΈ μΌ€μ΄μŠ€λ§ˆλ‹€ μ΄ˆκΈ°ν™”λ₯Ό ν–ˆμŠ΅λ‹ˆλ‹€.

#include <iostream>
#include <cstring>
using namespace std;
bool isFriend[10][10];
bool isFind[10];
int c, n, m;
int recursion(bool isFind[10]);
int main(){
    cin >> c;
    while(c--){
        memset(isFriend,false,sizeof(isFriend));
        memset(isFind,false,sizeof(isFind));
        cin >> n >> m;
        for(int i=1;i<=m;i++){
            int st, ed;
            cin >> st >> ed;
            isFriend[st][ed] = true;
            isFriend[ed][st] = true;
        }
        int result = recursion(isFind);
        cout << result << '\n';
    }
}
int recursion(bool isFind[10]){
    int firstSearch = - 1;
    for(int i=0;i<n;i++){
        if(!isFind[i]){
            firstSearch = i;
            break;
        }
    }
    if(firstSearch== -1) return 1;
    int ret = 0;
    for(int i=firstSearch+1;  i<n; i++){
        if(!isFind[i] && isFriend[firstSearch][i]){
            isFind[firstSearch] = true;
            isFind[i] = true;
            ret += recursion(isFind);
            isFind[firstSearch] = false;
            isFind[i]=false;
        }
    }
    return ret;
}

'Algorithm > AOJ' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[AOJ] BOARDCOVER  (0) 2022.03.14