2011年8月17日
摘要: POJ_2362 在有了POJ_1011的基础之后,这个题目还是能够比较轻松地独立完成的。#include<stdio.h>#include<string.h>#include<stdlib.h>int state[10010],st[10010],d,n,sum;int cmp(const void *_p,const void *_q){ int *p=(int *)_p; int *q=(int *)_q; return *q-*p; }int dfs(int rest,int complete,int start){ int i; if(rest== 阅读全文
posted @ 2011-08-17 22:23 Staginner 阅读(251) 评论(0) 推荐(0) 编辑
摘要: POJ_1011做完这个题目,让我不仅学到了一些别人剪枝的策略,更重要的是让我意识到了在搜索中剪枝的重要性。所谓剪枝,其实就是对程序的优化,尽可能地避免程序执行无用的操作。就这个题目而言,程序的优化主要有以下几个方面:①我们在拼木棒之前应该对木棒最长到短进行排序,这样方便我们后面挑选木棒的操作,因为如果前面先拼短木棒的话,很有可能后面任何一根木棒都不能填补剩余的长度,而先拼长木棒就可以在本来有解的情况下避免出现这种问题。②枚举拼好的木棒的长度时,枚举区间应在max(len)与sum/2之间,如果在这个区间内还没有找到解,那么最后的解只能是sum。③枚举的拼好的木棒的长度必须能够整除所有木棒长度 阅读全文
posted @ 2011-08-17 21:33 Staginner 阅读(544) 评论(3) 推荐(0) 编辑
摘要: POJ_1753这个题目第一次看也确实没有什么思想,后来到网上看了一下“点灯游戏”的简介,也获得了不少的启发。这个题目关键的算法思想在于,对最少操作次数而言,由于每个棋子点击偶数次相当于没点,同时点击的顺序并不影响最终结果,所以每个棋子要么点击一次,要么干脆不点,理解了这一点之后思路便是大体形成了。于是把黑、白棋布局用1、0存储,再用一个4*4的数组和16层for循环来枚举操作的所有情况,之后一一计算每种操作是否能达到预期效果以及其所需的操作次数即可,所有的情况是2^16种,计算量还是可以接受的。(中间过了很多天……)时隔一个月之后,已经做完了八数码,便迫不及待的想找个题来巩固一下做八数码学到 阅读全文
posted @ 2011-08-17 02:04 Staginner 阅读(380) 评论(0) 推荐(0) 编辑
摘要: POJ_1077经典的八数码问题,做完之后突然想到一句台词:“我的人生又趋于完整了一点……”。一开始接触这个确实觉得比较难,后来突然在刘汝佳书上发现原来是有讲这个问题的,于是我如获至宝,赶紧研究起刘汝佳的代码来,边学边写,总算是把代码写完了,同时又在他的代码和提示的基础上自己写了打印路径的方式。研究这个题的代码时,第一次比较认真地看了Hash的有关内容,掌握了一些基础的Hash判重的方法,同时对状态的表示也有了更深一步的理解,总之收获不菲呀。#include<stdio.h>#include<string.h>#define MAX 1000000#define HAS 阅读全文
posted @ 2011-08-17 00:22 Staginner 阅读(704) 评论(1) 推荐(1) 编辑