UVa OJ 110

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值