uva 110 Meta-Loopless Sorts 用程序写程序 有点复杂的回溯水题
题目要求写一个直接用比较排序的pascal程序,挺有趣的一题。
我看题目数据范围就到8,本来以为贪个小便宜,用switch输出。
然后发现比较次数是阶乘级别的,8的阶乘也是挺大的,恐怕会交不上去。
于是改用回溯法。
其实他比较时就是把后面的数一个一个向前比较,然后插到那位前面,继续回溯。
else的处理比较麻烦而已,改了好久终于跟标准答案一样了。
缩进没有处理,提交上去就ac了,看来oj没有检查缩进呢,如果有检查就还得处理一下了。
代码:(未进行缩进处理)
#include <cstdio> const int maxn = 10; int n, arr[maxn]; void insert_sort(int p, int c) { //插入排序 for (int i = c; i > p; i--) arr[i] = arr[i - 1]; arr[p] = c; } int dfs(int d) { int tmp[d + 1]; //创建数组储存原来的数值,不然会乱掉 for (int j = 1; j <= n; j++) tmp[j] = arr[j]; for (int i = d; i >= 1; i--) { //循环从现排好的串后序进行dfs printf("if %c < %c then\n", arr[i] + 'a' - 1, d + 'a'); insert_sort(i + 1, d + 1); //将接下去的字母插入到i+1的位置 if (d + 1 == n) { //dfs到最深处,输出 printf("writeln("); printf("%c", arr[1] + 'a' - 1); for (int j = 2; j <= d + 1; j++) printf(",%c", arr[j] + 'a' - 1); printf(")\n"); printf("else\n"); } else { dfs(d + 1); printf("else\n"); } for (int j = 1; j <= n; j++) //还原数组 arr[j] = tmp[j]; } insert_sort(1, d + 1); //下面是对最后一个情况,即字母插到整个数组前面,这里是没有else的 if (d + 1 == n) { printf("writeln("); printf("%c", arr[1] + 'a' - 1); for (int j = 2; j <= d + 1; j++) printf(",%c", arr[j] + 'a' - 1); printf(")\n"); } else dfs(d + 1); for (int i = 1; i <= n; i++) arr[i] = tmp[i]; } int main() { int t; scanf("%d", &t); while (t--) { scanf("%d", &n); //前面部分 printf("program sort(input,output);\nvar\n"); printf("a"); for (int i = 2; i <= n; i++) printf(",%c", i + 'a' - 1); printf(" : integer;\nbegin\nreadln("); printf("a"); for (int i = 2; i <= n; i++) printf(",%c", i + 'a' - 1); printf(");\n"); dfs(0); //开始深搜 printf("end.\n"); if (t != 0) printf("\n"); } return 0; }