uva110

来源:互联网 发布:上海炫踪网络信息科技 编辑:程序博客网 时间:2024/06/07 09:00


//对递归还是不熟悉啊,搞了很久,有点受不了自己了


#include<stdio.h>#include<string.h>#include<ctype.h>#include<stdlib.h>#include<math.h>int n,vis[100];char ss[100],tt[100];void link(int x,int y,int c){int i;for(i=c;i>=x;i--)tt[i+1]=tt[i];tt[x]=ss[y];}void home(int x,int y,int c){int i;for(i=x;i<c;i++)tt[i]=tt[i+1];}void dfs(int x,int y)//x用来标志已经添加元素的最大坐标,输出y个前导空格{int i,j,ok=1;if(x==n-1)//输出排序后的序列{for(i=0;i<x+4;i++)printf(" ");printf("writeln(");for(i=0;i<n;i++){printf("%c",tt[i]);if(i!=n-1) printf(",");}printf(")\n");return ;}for(i=x;i>=0;i--){if(ok)//输出了else时if不输出前导空格for(j=0;j<y;j++)printf(" ");ok=1;printf("if %c < %c then\n",tt[i],ss[x+1]);link(i+1,x+1,x+1);//插入元素dfs(x+1,y+2);home(i+1,x+1,x+1);//移除元素for(j=0;j<y;j++)printf(" ");if(i!=0) printf("else ");else if(i==0)//最后的else列外,要换行{printf("else\n");link(i,x+1,x+1);dfs(x+1,y+2);home(i,x+1,x+1);}ok=0;}}main(){int i,j,k,t,num,count;char s[100];scanf("%d",&t);while(t--){count=num=0;printf("program sort(input,output);\nvar\n");scanf("%d",&n);for(i=0;i<n;i++){s[num++]=i+'a';ss[count++]=i+'a';if(i!=n-1)s[num++]=',';}ss[count]=s[num]='\0';printf("%s",s);printf(" : integer;\nbegin\n  readln(%s);\n",s);tt[0]=ss[0];dfs(0,2);printf("end.\n");if(t!=0)printf("\n");}return 0;}