這一題是給一疊大小不一的鬆餅,要用整個堆疊旋轉的方式,讓鬆餅從小到大排序。輸出結果不需是最佳解,只要能夠讓鬆餅排序就可以了。我覺得寫這題就是頭腦要清楚啊,因為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