題目要求寫一個直接用比較排序的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; } #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; }