QuizWit

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ QuizWit ] in KIDS
글 쓴 이(By): parsec ( 먼 소 류 )
날 짜 (Date): 2002년 5월 29일 수요일 오후 05시 58분 57초
제 목(Title): Re: 간단한(?) 조합문제


짝수개인 경우엔 cdpark님이 옛날에 풀어놓으셨군요.
마치 아라비아인의 낙타 문제처럼 하나를 왕따시킨 다음, 나머지가 돌아가며
중매를 맡아 짝을 지어주고 중매쟁이와 왕따가 짝짓는 방식이네요.
홀수개인 때엔 왕따가 필요없네요.

여튼 앞에서 제가 푼 방식은 다음과 같이 C코드로 만들 수 있습니다.

void calcmatch(int **tbl, int n)
{
int i, j, k, max, test;

for(i=0; i<n; i++) for(j=0;j<n;j++) {
tbl[i][j] = 0;
}

for(i=0; i<n; i++) for(j=i+1; j<n; j++) {
max=0;
for(k=0; k<i; k++) if(tbl[k][j]>=max) max=tbl[k][j]+1;
for(k=0; k<j; k++) if(tbl[i][k]>=max) max=tbl[i][k]+1;
max %= (n+1)/2*2;
if(max==0) max++;
do {
test=0;
for(k=0; k<i; k++) if(tbl[k][j]==max) test=1;
for(k=0; k<j; k++) if(tbl[i][k]==max) test=1;
if(test==1) max++;
} while (test==1);
tbl[i][j] = max;
tbl[j][i] = max;
}
}

void printtbl(int **tbl, int n)
{
int i,j,k;
printf("  ");
for(i=0; i<n; i++) printf("%c ",'A'+i);
printf("\n");
for(i=0; i<n; i++) { printf("%c ",'A'+i);
for(j=0;j<n;j++) {
if(tbl[i][j]==0)printf("X");
else printf("%d",tbl[i][j]);
if(j==n-1) printf("\n");
else printf(" ");
} }
printf("\n");
}

void printmatch(int **tbl, int n)
{
int i,j,k;
for(k=1; k<=(n-1)/2*2+1; k++) {
printf("Day %3d: ", k);
for(i=0; i<n; i++) for(j=i+1; j<n; j++) {
if(tbl[i][j]==k) printf("%c-%c ",'A'+i,'A'+j);
}
if(i==n) printf("\n");
}
}

             ◇    ~~~_ _
            ∴      ~|~| |     _/__,         SEP. 11. 2001
         _ ∴∴ _    ~ | |      \ `         Armorica under a tat
      ,-| `,-,_| |__ | | |   A
______|_|__|_|___|__|| | |__|_|_____________________________________
[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.