S. Kevin 창고

한번만 눌러주세요!
촌수계산

          우리 나라는 가족 혹은 친척들 사이의 관계를 촌수라는 단위로 표현하는 독특한 문화를 가지고 있다. 이러한 촌수는 다음과 같은 방식으로 계산된다. 기본적으로 부모와 자식 사이를 1촌으로 정의하고 이로부터 사람들 간의 촌수를 계산한다. 예를 들면 나와 아버지, 아버지와 할아버지는 각각 1촌이므로 나와 할아버지는 2촌이 되고, 아버지 형제들과 할아버지는 1촌이므로 나와 아버지 형제들과는 3촌이 된다. 여러 사람들에 대한 부모 자식들 간의 관계가 주어졌을 때, 주어진 두 사람의 촌수를 계산하는 프로그램을 작성하시오.

          실행 파일의 이름은 FAMILY.EXE로 하고, 프로그램의 실행시간은 10초를 초과할 수 없다. 정확한 답에 대하여서는 만점으로 채점하고, 틀린 답에 대하여서는 0점으로 채점한다.

    입력 형식

          입력 파일명은 INPUT.TXT로 한다. 사람들은 1,2,3,...,n(1≤n≤100)의 연속된 번호로 각각 표시된다. 입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고, 둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어진다. 그리고 셋째 줄에는 부모 자식들 간의 관계의 개수 m 이 주어진다. 넷째 줄부터는   부모 자식간의 관계를 나타내는 두 번호x y가 각 줄에 나온다. 이때 앞에 나오는 번호 x 는 뒤에 나오는 정수 y 의 부모 번호를 나타낸다.

    출력 형식

          출력 파일명은 OUTPUT.TXT로 한다. 입력 파일에서 요구한 두 사람의 촌수를 나타내는 정수를 출력한다. 어떤 경우에는 두 사람간의 친척 관계가 전혀 없어 촌수를 계산할 수 없을 때가 있다. 이 때에는 -1을 출력해야한다.

    입력과 출력의 예(1)
          다음은 9명의 사람으로 구성된 촌수 관계에서 7번과 3번의 촌수를 구하는 입력 데이터의 예이다.

    입력(INPUT.TXT)9

    9
    7 3
    7
    1 2
    1 3
    2 7
    2 8
    2 9
    4 5
    4 6



    출력(OUTPUT.TXT)

    3


    입력과 출력의 예(2)

    입력(INPUT.TXT)

    9
    8 6
    7
    1 2
    1 3
    2 7
    2 8
    2 9
    4 5
    4 6


    출력(OUTPUT.TXT)

    -1

    문제출처 : www.dovelet.com

    소스 : 

      #include <stdio.h>

      #include <stdlib.h>


      struct form {

      int lnk[101];

      }data[11];


      void process(int k);


      int n,m;

      int cnt = 1, chk = 0;

      int x,y, tmx, tmy, tmlx;


      int main() {

      int i;


      scanf("%d", &n);

      scanf("%d %d", &x, &y);

      scanf("%d", &m);


      for (i = 1; i<= m; i++) {

      scanf(" %d %d", &tmx, &tmy);

      data[tmx].lnk[tmy] = data[tmy].lnk[tmx] = 1;

      if (tmy == x) tmlx = tmx;

      }

      process(tmlx);


      if (chk == 0)

      printf("%d", cnt);

      else

      printf("-1");



      return 0;

      }


      void process(int k) {


      int i;


      if (k == y)

      return;


      for (i = 1; i <= n; i++) {

      if ( data[i].lnk[k] == 1 ) {

      cnt++;

      data[k].lnk[i] = 0;

      process(i);

      return;

      }

      }

      chk = 1;


      }


    솔직히 제 소스에 나와있는 구조체 필요 없습니다.

    구조체 없이 차라리 2차원 써도되요.
    제가 만든 구조체가 2차원 형태이기 때문이죠.

    백트래킹으로 풀었으나, 인터넷에는 플로이드로도 할 수 있다네요.
     

'프로그래밍 > 알고리즘' 카테고리의 다른 글

프로그램 명: suffix_array(open)  (0) 2012.06.22
[Finite Automata, computational geometry] 내부점 판별 (in_out)  (0) 2012.01.16
[더블릿] KnapSack  (0) 2012.01.06
[더블릿] 행오버  (0) 2012.01.04
버스  (0) 2012.01.03