UVA-110
题意:给出pascal的写法,然后问你一个n个数的排序,只用if,要怎么比较出来。然后要用pascal的写法写输出出来。
解题思路:学过pascal,好久没有用了,本来是一个美好的回忆,却被这题无情摧毁了。
言归正传。很明显每次只是对两个数进行比较,很容易想到DFS逐一控制输出。难度还好,就是第一次遇到这种题有点懵。注意每深入一次DFS前面的空格数会+2。
/*************************************************************************
> File Name: UVA-110.cpp
> Author: Narsh
>
> Created Time: 2016年07月26日 星期二 20时16分11秒
************************************************************************/
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
int n,m,t;
char ans[12];
void dfs(int now, int space) {
if (now>n) {
for (int i = 1; i <= space; i++) printf(" ");
printf("writeln(");
for (int i = 1; i <= n; i++) {
printf("%c",ans[i]);
if (i == n) printf(")\n");
else printf(",");
}
return ;
}
for (int i = 1; i <= space; i++)
printf(" ");
printf("if %c < %c then\n",ans[now-1],'a'+now-1);
ans[now] ='a'+now-1;
dfs(now+1,space+2);
for (int i = now-2; i >= 0; i--) {
for (int j = 1; j <= space; j++) printf(" ");
if (i > 0) printf("else if %c < %c then\n",ans[i],'a'+now-1);
else printf("else\n");
for (int j = now; j > i+1; j--) ans[j] = ans[j-1];
ans[i+1] = 'a'+now-1;
dfs(now+1,space+2);
for (int j = i+1; j < now; j++) ans[j] = ans[j+1];
}
}
int main() {
scanf("%d",&t);
while (t--) {
printf("program sort(input,output);\nvar\n");
scanf("%d",&n);
for (int i = 1; i <= n; i++){
ans[i]='a'+i-1;
printf("%c",ans[i]);
if (i == n) printf(" : integer;\n");
else printf(",");
}
printf("begin\n readln(");
for (int i = 1; i <= n; i++){
printf("%c",ans[i]);
if (i == n) printf(");\n");
else printf(",");
}
ans[1]='a';
dfs(2,2);
printf("end.\n");
if (t) printf("\n");
}
}