总的来讲,这是一道很⑨的题,因为:
(1)题目中有⑨个挂钟
(2)有⑨种操作方案
(3)这题因为解空间太小所以可以直接⑨重循环!!
这题可以用迭代加深搜索高效求解,剪枝的策略也很显然:
>所求的操作序列一定是单调不递减的
>同一操作不可能在解中出现4次及以上(操作4次等于没有操作)
代码:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; ]={}; ]={}; ]={}; void move(int _cmd) { ++cmdCnt[_cmd]; switch(_cmd) { : ++dir[]; ++dir[]; ++dir[]; ++dir[]; break; : ++dir[]; ++dir[]; ++dir[]; break; : ++dir[]; ++dir[]; ++dir[]; ++dir[]; break; : ++dir[]; ++dir[]; ++dir[]; break; : ++dir[]; ++dir[]; ++dir[]; ++dir[]; ++dir[]; break; : ++dir[]; ++dir[]; ++dir[]; break; : ++dir[]; ++dir[]; ++dir[]; ++dir[]; break; : ++dir[]; ++dir[]; ++dir[]; break; : ++dir[]; ++dir[]; ++dir[]; ++dir[]; break; } } void undo(int _cmd) { --cmdCnt[_cmd]; switch(_cmd) { : --dir[]; --dir[]; --dir[]; --dir[]; break; : --dir[]; --dir[]; --dir[]; break; : --dir[]; --dir[]; --dir[]; --dir[]; break; : --dir[]; --dir[]; --dir[]; break; : --dir[]; --dir[]; --dir[]; --dir[]; --dir[]; break; : --dir[]; --dir[]; --dir[]; break; : --dir[]; --dir[]; --dir[]; --dir[]; break; : --dir[]; --dir[]; --dir[]; break; : --dir[]; --dir[]; --dir[]; --dir[]; break; } } inline bool isDest() { ;i<=;i++) ) return false; return true; } bool search_aux(int _maxDepth,int _curDepth,int _lastCmd) { if(isDest()) return true; if(_curDepth > _maxDepth) return false; ;i++) { ) { move(i); ,i); undo(i); if(next) { ++ans[i]; return true; } } } return false; } void input() { ;i<=;i++) scanf("%d",dir+i); } void search() { ;;i++) ,)) return; } void printAns() { ;i<=;i++) while(ans[i]--) printf("%d ",i); } int main() { input(); search(); printAns(); ; }
Cirno is willing to try this problem (*^__^*)