這題寫出來也很感動,原因一是自己想到演算法解出了graph題!原因二是寫完以後de了超久的bug,明明自己測試output都正確,一直找不到runtime error的原因。看超久才發現原來是把一個變數放錯資料型別,改了以後總算AC了!
我用一個一維陣列存每個child的parent,再不斷trace。
CODE
#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_NAMES 300 #define LEN_NAME 31 int tree[MAX_NAMES], maxn; char name[MAX_NAMES][LEN_NAME+1]; int addname(char *s); int findname(char *s); void qry(int p, int q); void showtrace(int t); int isdescendent(int p, int q, char *s); int iscousin(int p, int q); int main(){ int pk, qk; char p[LEN_NAME+1], q[LEN_NAME+1]; maxn = 0; while( scanf("%s %s", p, q) == 2 ){ if( strcmp(p, "no.child") == 0 ) break; else{ pk = addname(p); qk = addname(q); tree[pk] = qk; } }/*while parent-child pairs input*/ /*read query*/ while( scanf("%s %s", p, q) == 2 ){ pk = findname(p); qk = findname(q); qry(pk, qk); }/*while query input*/ exit(0); } int addname(char *s){ int i; /*check if name exists*/ for(i=0; i<maxn; i++) if( strcmp(s, name[i]) == 0 ) return i; /*add new name*/ strcpy(name[maxn], s); tree[maxn] = maxn; maxn++; return (maxn-1); } int findname(char *s){ int i; for(i=0; i<maxn; i++) if( strcmp(s, name[i]) == 0 ) return i; return -1; } void qry(int p, int q){ if( p != -1 && q != -1 ){ if( tree[p] == tree[q] ){ printf("sibling\n"); return; } if( isdescendent(p, q, "child") == 1 ) return; if( isdescendent(q, p, "parent") == 1 ) return; if( iscousin(p, q) == 1 ) return; }/*if p, q != -1 */ printf("no relation\n"); return; } void showtrace(int t){ int i; if( t == 0 ) return; for(i=t; i>1; i--) printf("great "); printf("grand "); } int isdescendent(int p, int q, char *s){ int tp, trace; tp = p; trace = 0; while( tree[tp] != tp ){ tp = tree[tp]; if( tp == q ){ showtrace(trace); printf("%s\n", s); return 1; } trace++; } return 0; } int iscousin(int p, int q){ int tp, tq, m, n; tp = p; tq = q; m = n = 0; while( tp != tree[tp] ){ tp = tree[tp]; while( tq != tree[tq] ){ tq = tree[tq]; if( tp == tq ){ if( m > n ){ printf("%d cousin ", n); printf("removed %d\n", (m-n)); } else if( m == n ) printf("%d cousin\n", m); else{ printf("%d cousin ", m); printf("removed %d\n", (n-m)); } return 1; }/*if common ancestor found*/ n++; }/*while: trace q*/ tq = q; n = 0; m++; }/*while: trace p*/ return 0; }
No comments:
Post a Comment