Thursday, August 26, 2010

ACM: 120 - Stacks of Flapjacks

這一題是給一疊大小不一的鬆餅,要用整個堆疊旋轉的方式,讓鬆餅從小到大排序。輸出結果不需是最佳解,只要能夠讓鬆餅排序就可以了。我覺得寫這題就是頭腦要清楚啊,因為input資料是從top開始,但要輸出的flip數字卻要從bottom算起!

CODE

#include <stdio.h>

#define MAX 30

int n, cake[MAX];

int makenum(int p, int *a);
void flipcake(int p);

int main(){
  int i, k, max, flag;
  int p, num[3];
  char c;

  n = p = flag = 0;
  while( (c = getchar()) != EOF ){
    if( c >= '0' && c <= '9' ){
      num[p++] = c - '0';
    }/*if '0'<= c <='9'*/
    else if( c == ' ' ){
      cake[n++] = makenum(p, num);
      p = 0;
    }/*if c == ' '*/
    else if( c == '\n' ){
      if( p > 0 )
        cake[n++] = makenum(p, num);
      
      if( n > 0 ){
        printf("%d", cake[0]);
        for(i=1; i<n; i++)
          printf(" %d", cake[i]);
        printf("\n");
        
        for(i=0; i<n; i++){
          max = 0;
          for(k=1; k<(n-i); k++){
            if( cake[k] > cake[max] )
              max = k;
          }/*k: find max pancake*/
          
          /*flip biggest pancake to top*/
          if( max>0 && max<(n-i-1) ){
            flipcake(max);
            if( flag == 1 ) printf(" ");
            else flag = 1;
            printf("%d", n-max);
          }
          /*flip biggest pancake to current bottom*/
          if( max<(n-i-1) ){
            flipcake(n-i-1);
            if( flag == 1 ) printf(" ");
            else flag = 1;
            printf("%d", i+1);
          }
        }/*j: sort the pancake*/
        
        if( flag == 1 ) printf(" ");
        printf("0\n");
      }/*if valid input*/
            
      n = p = flag = 0;
    }/*if c == '\n'*/
    else ;
  }/*while*/
  
  exit(0);
}

int makenum(int p, int *a){
  if( p == 3 )
    return 100;
  if( p == 2 )
    return (a[0]*10 + a[1]);
  return a[0];
}

void flipcake(int p){
  int i, j, tmp;
  
  for(i=0, j=p; i<=j; i++, j--){
    tmp = cake[i];
    cake[i] = cake[j];
    cake[j] = tmp;
  }
}

No comments:

Post a Comment