实际就是求一个全排列,因为给出的数字最大是8,所以最多有8!种情况。
根据给出的样例我们可以将其看成向已给出的排列中倒叙插入新元素(其实就是插空),如:给出n=3,则最开始为 a,然后将b插入最后为ab,再插入c,为abc,c依次向前插入acb,cab,然后递归返回上一层,b向前移顺序变为ba,继而相继产生bac,bca,cba。
代码如下:
#include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> using namespace std; char a[10], b[10]; void print_space(int cur) // 打印空格 { for(int i = 0; i < cur; i++) printf(" "); } void judge(int cur, int n) { char d[10]; print_space(cur); if(cur == n) { printf("writeln("); printf("%c",a[0]); for(int i = 1; i < n; i++) printf(",%c", a[i]); printf(")\n"); return ; } char c = b[cur]; a[cur] = b[cur]; a[cur + 1] = 0; strcpy(d, a); // 将原串存入d if(cur >0) { int po; printf("if "); printf("%c < %c", a[cur - 1], a[cur]); printf(" then\n"); judge(cur + 1, n); po = cur - 1; for(int i = cur - 1; i > 0; i--) { strcpy(a, d); // 恢复原串,再倒序插入元素 print_space(cur); printf("else if "); printf("%c < %c", a[i - 1], a[cur]); for(int j = cur; j > i; j--) a[j] = a[j - 1]; a[i] = c; printf(" then\n"); judge(cur + 1, n); } strcpy(a, d); for(int j = cur; j > 0; j--) a[j] = a[j - 1]; a[0] = c; print_space(cur); printf("else \n"); judge(cur + 1, n); } else judge(cur + 1, n); } int main() { #ifdef test freopen("sample.txt", "r", stdin); #endif int t, n; scanf("%d", &t); while(t--) { scanf("%d", &n); for(int i = 0; i < n; i++) b[i] = 'a' + i; printf("program sort(input,output);\nvar\n"); printf("%c", b[0]); for(int i = 1; i < n; i++) // 初始化,依次将其赋为a,b,c... printf(",%c", b[i]); printf(" : integer;\nbegin\n"); printf(" readln(%c", b[0]); for(int i = 1; i < n; i++) printf(",%c", b[i]); printf(");\n"); judge(0, n); printf("end.\n"); if(t) puts(""); } return 0; }