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