110UVA没有循环的快速排序STL

来源:互联网 发布:网络谣言的危害 编辑:程序博客网 时间:2024/05/18 08:14

参考了http://www.cnblogs.com/devymex/archive/2010/08/10/1796178.html

的思路:

Analysis
分析

关键在于如何生成给定数量元素的全排列,很自然的使用递归算法。考虑n = 3的情况,相应的3个变量为a, b, c。在结果集里加入a作为初始化,之后b可以在a前面或后面2种位置可以插入,分别代表b < a或b > a的情况。这样就可以生成第1级的if-else语句,并递归调用至2级。对于"ba"顺序的结果集,c有三种位置可以插入,对应的语句应该是:

1
2
3
4
5
6
if c < b then
...
else if c < a then
...
else
...

由此生成第2级的if-else语句。再递归调用至第3级,发现已到达最高级,输出结果并返回。

这道题有一个需要特别注意的地方,生成的第一道代码前不要有任何空行,每段代码后也不要紧跟着空行。而是从第二段代码开始,头部需要加一个空行。如果没有注意这个问题,会得到PE。

自己写的代码:

#include<list>using namespace std;#include<stdio.h>#include<string.h>char twospace[3]="  ";void recs(int cur,int n,list<char> clist);int main(){int m;scanf("%d",&m);while(m--){int n;scanf("%d",&n);puts("program sort(input,output);");puts("var");for(int i=0; i < n;i++){if(i!=0) putchar(',');putchar('a'+i);}puts(" : integer;");  //puts("begin");printf("%s","  readln(");for(int i=0; i < n;i++){if(i!=0) putchar(',');putchar('a'+i);}puts(");"); list<char> clist;clist.push_back('a');recs(0,n,clist);puts("end.");if(m) putchar('\n');}}void recs(int cur,int n,list<char> clist){if(clist.size()==n){//for(int i=0; i<=cur;i++)printf("%s",twospace);printf("%s","writeln(");list<char>::iterator it = clist.begin();for(; it != clist.end(); it++){if(it!= clist.begin())putchar(',');putchar(*it);}puts(")");return;}list<char>::iterator it = clist.begin();list<char>::iterator end = clist.end();list<char>::iterator t;for(; it != end;){//for(int i=0; i<=cur;i++)printf("%s",twospace);if(it != clist.begin())printf("%s ","else");printf("if %c < %c then\n",cur+'b',*it);clist.insert(it,cur+'b');it--;recs(1+cur,n,clist);it = clist.erase(it);it++;}//for(int i=0; i<=cur;i++)printf("%s",twospace);printf("%s\n","else");clist.push_back(cur+'b');recs(1+cur,n,clist);clist.pop_back();return;}


0 0