Gather the Maps!
ACM/ICPCの問題を解いてみる。解けそうなアルゴリズムはすぐに思いついたが、実装してみるとリジェクトされてしまう。いくつかテストケースを作って通してみても通っているように見える・・・どこが間違っているかわからない。また一から作ってみよう
一応ソースコードを貼っておく。スペルミスに関する苦情は受け付けません。
#include
int schedule[50][31];
int GathertheMaps(int t){
int answer = -1;
int gloup[50];
int i,j,min;
for(i = 0;i < 50;i++){
gloup[i] = i;
}
for(i = 1;i <= 30;i++){
int end_flag= 0;
min = 100;
for(j = 0;j < t;j++){
if(schedule[j][i] == 1){
printf("%d ",gloup[j]);
if(min > gloup[j]){
min = gloup[j];
}
}
}
printf(" : %d\n",min);
for(j = 0;j < t;j++){
int temp;
int k;
if(schedule[j][i] == 1 && gloup[j] != min){
temp = gloup[j];
printf("%d→%d ",temp,min);
for(k = 0;k < t;k++){
if(temp == gloup[k])gloup[k] = min;
}
}
}
printf("\n");
for(j = 0;j < t;j++){
if(min == gloup[j])end_flag++;
printf("%2d:%d ",gloup[j],schedule[j][i]);
}
printf("\n");
if(end_flag == t){
answer = i;
break;
}
}
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;
}