为防止广告,目前nocow只有登录用户能够创建新页面。如要创建页面请先登录/注册(新用户需要等待1个小时才能正常使用该功能)。
USACO/wissqu
这篇文章可以证实是由NOCOW用户原创,不存在任何版权争议。 本文作者同意以GNU FDL、CC-by-sa和GNU LGPL(如果适用)三种版权发布此文章(不包括翻译文章中属于原始所有者的部分版权)。 如果你修改了这篇文章并且不同意用GNU FDL以外的版权发布,可以换一个版权模板或者移除此模板。
- 这是USACO Chapter 6 .4中的OI题目Wisconsin Squares的介绍及题解,参见 翻译,C语言代码,C++语言代码,Pascal语言代码。
[编辑] 问题分析
搜索。随便加一点优化,只要你的算法能在5s内通过样例,就尽管提交,保证不超时。 PS:只有一组数据——路人(我也是醉了)
[编辑] Update
本题~一般来说同样的算法,用c++比较不会tle。如果用pascal,然后不cheat(例如说前3位规定为DCA或if count=149** then halt)的话pascal要ac要充分的常数优化技巧,包括各种循环的位置、编译开关和固定内存空间、inline等。
(如果你的程序在你自己的机子上2s,就可以ac,否则tle。貌似USACO这道题5s实际只类似于2s。)
——phoeagon 我家这破机子运行了十多秒...在USACO里面过了,yeah! ----路人*
或许phoeagon的机子cpu太强
更正:Pascal不用卡时也能过。 判断能不能放的时候不要暴力的8方向判定,而是利用一个数组f[i,j,k]表示(i,j)周围k类牛的个数来快速判定。再加上第一步要移'D'类牛的剪枝应该可以过。 本人写的较烂,4.6s
——路人B.C. 也不用那样暴枚咯,对种类和位置用两个lowbit来搜,俺用C交上去跑得飞快 Executing...
Test 1: TEST OK [1.539 secs, 2160 KB]
搜索,加剪枝。通过观察样例可知,开始时只有 D 可以替换,而 D 替换 C 后,只有 C 后来把 A 替换,然后只有 A 把 B 替换……但是我们可以看出,在 C 替换 A 时, 当时是没有位置可以替换 D 的, A 替换 B 时亦然。
综上所述, 设开始可以替换的字母集合为 { D }, 当用 X 替换 Y 后, 把 Y 加入集合。
搜索时用这个集合进行剪枝。Test 1: TEST OK [0.270 secs, 3180 KB]。 程序见warcraf5 --Eurekash:不需要任何优化,直接搜索即可……TEST OK [1.566 secs, 3052 KB]
BY:tangyan022
Executing...
Test 1: TEST OK [0.022 secs, 4320 KB]
All tests OK.
问题在于 直接搜肯定超时 中间有许多重复的解,如果用HASH表能很快找到第一个解, 而无法按题目要求统计所有解。
注意到,一种方案中, 只更换字母的排列组合坐标不变就能产生许多方案。
因此我们写两个DFS, DFS1每次找到一种方案。 就把这个方案的坐标保存起来 再用DFS2,对固定的坐标DFS出对应排列和组合,统计起来即可