题目:http://www.nocow.cn/index.php/Translate:USACO/cryptcow
好变态的一道题。我现在写出来的程序可以通过7次加密的,但是8次加密的求解有点难度,会超时。毕竟使用的是最笨的回溯算法。
有几个注意点吧:
第一, 要优化搜索顺序。经过试验我们可以发现,O的位置对于整个COW至关重要。可以说,O的位置决定了整个串是否会有解。因此,我们在搜索时,应该先枚举O的位置,然后再枚举C和W的位置。而且从O开始感觉思路会清晰很多。
第二,一个有解的字符串中,COW三个字母最早出现的应该是C,最后出现的应该是W,如果不满足则剪枝。
第三,对搜索到的字符串,设不包含COW的最长前缀为n前缀(同样也可以定义n后缀),那么如果n前缀不等于目标串的长度相同的前缀,那么当前字符串一定无解,剪枝。N后缀也可采取相同的判断方法。
还有其他的根据长度,进行粗略判断的。另外别人的解题报告里面还有其他的方式。
总之大体思路就是回溯剪枝。
另外发现GCC的编译器,跟微软的自带编译器有点不一样,第一次出现本地编译通过,服务器编译不通过的情况。
有时间好好看看这两块的区别。