1、太开心了~这道题写了整整两天终于AC了~这是一道非常奇葩的题目,要求编程来“制造”一个冒泡排序的程序。。。其实是求排列。。。用回溯法就好了。
2、刚开始因为没把temp设成临时变量,怎么都不对,改了后又发现search函数的第一句应该用insert来修改而不是直接赋值,修改后居然WA,后来发现是看错了题目的输入。。。囧。。。第一个是测试数据组数,而不是n。。。改了后总算是AC了,相当有成就感!
3、简单说下题目做法吧:首先在第一个位置安插a,然后枚举a之前和a之后(安插b),递归后同理,在ab的三个空档位置安插c(a之前,a、b间,b之后)。注意else,if else,以及空格就好了。至此,枚举法部分结束。
#include<cstdio>
#include<cstring>
using namespace std;
int n,s[10],T;
void insert(int n,int p,int len){
for(int i=len-1;i>=p;i--)
s[i+1]=s[i];
s[p]='a'+n;
}
void search(int num,int space,int count,int place){
int temp[10],i;
insert(num,place,count);
for(int x=0;x<=count;x++)
temp[x]=s[x];
for(i=count+1;i>=0;i--){
for(int x=0;x<=count;x++)
s[x]=temp[x];
insert(num+1,i,count+1);
if(i==count+1){
for(int j=0;j<space;j++) printf(" ");
printf("if %c < %c then\n",s[i-1],num+1+'a');
}
else if(i==0){
for(int j=0;j<space;j++) printf(" ");
printf("else\n");
}
else{
for(int j=0;j<space;j++) printf(" ");
printf("else if %c < %c then\n",s[i-1],num+1+'a');
}
if(count+1==n-1){
for(int k=0;k<space+2;k++) printf(" ");
printf("writeln(");
for(int i=0;i<=n-1;i++){
printf("%c",s[i]);
if(i<n-1) printf(",");
else if(i==n-1) printf(")\n");
}
}
else{
for(int x=0;x<=count;x++)
s[x]=temp[x];
search(num+1,space+2,count+1,i);
}
}
return;
}
int main()
{
scanf("%d",&T);
while(T--){
scanf("%d",&n);
printf("program sort(input,output);\n");
printf("var\n");
for(int i=0;i<n;i++){
printf("%c",'a'+i);
if(i!=n-1) printf(",");
else printf(" : integer;\n");
}
printf("begin\n");
printf(" readln(");
for(int i=0;i<n;i++){
printf("%c",'a'+i);
if(i!=n-1) printf(",");
else printf(");\n");
}
memset(s,'\0',sizeof(s));
if(n==1) printf(" writeln(a)\n");
else
search(0,2,0,0);
printf("end.\n");
if(T>0) printf("\n");
}
return 0;
}
UVa OJ 110
最新推荐文章于 2021-03-18 15:57:44 发布