這題要寫出一個程式generate另一段程式碼。練習遞迴。Runtime 0.084,Ranking進入前100,超開心。
CODE
#include <stdio.h>
#define MAX 8
void showarr(int n, int *array);
void showspace(int sp);
void copyarr(int n, int *to, int *frm);
void insertarr(int n, int position, int end, int k, int *array);
void showmeta(int n, int pos, int *array);
int main(){
int i, j;
int m, n, a[MAX];
scanf("%d", &m);
for(i=0; i<m; i++){
scanf("%d", &n);
for(j=0; j<n; j++)
a[j] = j;
if( i > 0 )
printf("\n");
printf("program sort(input,output);\n");
printf("var\n");
showarr(n, a);
printf(" : integer;\n");
printf("begin\n");
printf(" readln(");
showarr(n, a);
printf(");\n");
if( n == 1 )
printf(" writeln(a)\n");
else
showmeta(n, 1, a);
printf("end.\n");
}/*i: m inputs*/
exit(0);
}
void showarr(int n, int *arr){
int i;
printf("%c", 'a'+arr[0]);
for(i=1; i<n; i++)
printf(",%c", 'a'+arr[i]);
}
void showspace(int sp){
int i;
for(i=1; i<=sp; i++)
printf(" ");
}
void copyarr(int n, int *to, int *frm){
int i;
for(i=0; i<n; i++)
to[i] = frm[i];
}
void insertarr(int n, int p, int e, int k, int *arr){
int i;
if( p == e )
arr[p] = k;
else{
for(i=e; i>p; i--)
arr[i] = arr[i-1];
arr[p] = k;
}
}
void showmeta(int n, int p, int *arr){
int i, cpy[MAX];
if( p == (n-1) ){
for(i=p; i>=0; i--){
copyarr(n, cpy, arr);
insertarr(n, i, p, p, cpy);
showspace(p);
if( i == p )
printf("if %c < %c then\n", 'a'+cpy[i-1], 'a'+p);
else if( i == 0 )
printf("else\n");
else
printf("else if %c < %c then\n", 'a'+cpy[i-1], 'a'+p);
showspace(p+1);
printf("writeln(");
showarr(n, cpy);
printf(")\n");
}/*i*/
}
else{
for(i=p; i>=0; i--){
copyarr(n, cpy, arr);
insertarr(n, i, p, p, cpy);
showspace(p);
if( i == p )
printf("if %c < %c then\n", 'a'+cpy[i-1], 'a'+p);
else if( i == 0 )
printf("else\n");
else
printf("else if %c < %c then\n", 'a'+cpy[i-1], 'a'+p);
showmeta(n, p+1, cpy);
}/*i*/
}
}
No comments:
Post a Comment