Gather the Maps!続き

 思いついた解法を頼りに作ってみたら、無事クリア。どうやら今までのコードだとこのサンプルが通らなかったらしい。このために丸一日使ってしまった

input
4
3 1 2 6
2 2 5
3 1 3 6
3 3 4 5
0

output
5

せっかくだからコードも晒す

#include

int schedule[50][31];

int GathertheMaps(int t){
int answer = -1;
int maps[50][50] = {{0,},};
int i,j,min;

for(i = 0;i < t;i++){
maps[i][i] = 1;
}

for(i = 1;i <= 30;i++){
for(j = 0;j < t;j++){
if(schedule[j][i] == 1){
int k;
for(k = 0;k < t;k++){
if(schedule[k][i] == 1){
int l;
for(l = 0;l < t;l++)maps[l][k] = maps[l][j] | maps[l][k];
}
}
}
}

for(j = 0;j < t;j++){
int copy_num = 0;
int k;
for(k = 0;k < t;k++){
copy_num += maps[k][j];
//printf("%d ",maps[k][j]);
}
//printf("%d \n",copy_num);
if(copy_num == t){
answer = i;
i = 30;
break;
}
}
//printf("\n");
}

return answer;
}

int main(void){

int n,i,j,t,f;

for(;;printf("\n")){

//printf("check\n");

for(i = 0;i < 50;i++){
for(j = 1;j <= 30;j++){
schedule[i][j] = 0;
}
}

//printf("check2\n");

scanf("%d",&n);

if(n == 0)break;

//printf("%d\n",n);

for(i = 0;i < n;i++){
scanf("%d",&t);
//printf("%d ",t);

for(j = 0;j < t;j++){
scanf("%d ",&f);
//printf("%d ",f);
schedule[i][f] = 1;
}
//printf("\n");
}

//
/*
for(j = 0;j < n;j++){
int k;
for(k = 1;k <= 30;k++){
printf("%d ",schedule[j][k]);
}
printf("\n");
}
*/
//

printf("%d",GathertheMaps(n));

}

return 0;
}