• 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
    ", 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(")
    ");
    			printf("else
    ");
    		}
    		else {
    			dfs(d + 1);
    			printf("else
    ");
    		}
    		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(")
    ");
    	}
    	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);
    var
    ");
    		printf("a");
    		for (int i = 2; i <= n; i++)
    			printf(",%c", i + 'a' - 1);
    		printf(" : integer;
    begin
    readln(");
    		printf("a");
    		for (int i = 2; i <= n; i++)
    			printf(",%c", i + 'a' - 1);
    		printf(");
    ");
    		dfs(0);				//开始深搜
    		printf("end.
    ");
    		if (t != 0)
    			printf("
    ");
    	}
    	return 0;
    }


  • 相关阅读:
    gulp-css-spriter 将css代码中的切片图片合并成雪碧图
    通过JS模拟select表单,达到美化效果[demo]
    jQuery拖拽 & 弹出层
    sublime text 快速编码技巧 GIT图
    原生JS不到30行,实现类似javascript MVC的功能-minTemplate
    javascript拖拽原理与简单实现方法[demo]
    滚动焦点图实现原理和实践[原创视频]
    谈一谈值类型与引用类型和装箱与拆箱
    【原创】asp.net内部原理(三) 第三个版本 (最详细的版本)
    由JS函数返回值引发的一场”血案"
  • 原文地址:https://www.cnblogs.com/java20130723/p/3212108.html
Copyright © 2020-2023  润新知