总的来讲,这是一道很⑨的题,因为:
(1)题目中有⑨个挂钟
(2)有⑨种操作方案
(3)这题因为解空间太小所以可以直接⑨重循环!!
这题可以用迭代加深搜索高效求解,剪枝的策略也很显然:
>所求的操作序列一定是单调不递减的
>同一操作不可能在解中出现4次及以上(操作4次等于没有操作)
代码:
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 using namespace std; 6 7 int dir[10]={0}; 8 int cmdCnt[10]={0}; 9 int ans[10]={0}; 10 11 void move(int _cmd) 12 { 13 ++cmdCnt[_cmd]; 14 15 switch(_cmd) 16 { 17 case 1: ++dir[1]; ++dir[2]; ++dir[4]; ++dir[5]; break; 18 case 2: ++dir[1]; ++dir[2]; ++dir[3]; break; 19 case 3: ++dir[2]; ++dir[3]; ++dir[5]; ++dir[6]; break; 20 case 4: ++dir[1]; ++dir[4]; ++dir[7]; break; 21 case 5: ++dir[2]; ++dir[4]; ++dir[5]; ++dir[6]; ++dir[8]; break; 22 case 6: ++dir[3]; ++dir[6]; ++dir[9]; break; 23 case 7: ++dir[4]; ++dir[5]; ++dir[7]; ++dir[8]; break; 24 case 8: ++dir[7]; ++dir[8]; ++dir[9]; break; 25 case 9: ++dir[5]; ++dir[6]; ++dir[8]; ++dir[9]; break; 26 } 27 } 28 29 void undo(int _cmd) 30 { 31 --cmdCnt[_cmd]; 32 33 switch(_cmd) 34 { 35 case 1: --dir[1]; --dir[2]; --dir[4]; --dir[5]; break; 36 case 2: --dir[1]; --dir[2]; --dir[3]; break; 37 case 3: --dir[2]; --dir[3]; --dir[5]; --dir[6]; break; 38 case 4: --dir[1]; --dir[4]; --dir[7]; break; 39 case 5: --dir[2]; --dir[4]; --dir[5]; --dir[6]; --dir[8]; break; 40 case 6: --dir[3]; --dir[6]; --dir[9]; break; 41 case 7: --dir[4]; --dir[5]; --dir[7]; --dir[8]; break; 42 case 8: --dir[7]; --dir[8]; --dir[9]; break; 43 case 9: --dir[5]; --dir[6]; --dir[8]; --dir[9]; break; 44 } 45 } 46 47 inline bool isDest() 48 { 49 for(int i=1;i<=9;i++) if(dir[i] & 3) return false; 50 return true; 51 } 52 53 bool search_aux(int _maxDepth,int _curDepth,int _lastCmd) 54 { 55 if(isDest()) return true; 56 if(_curDepth > _maxDepth) return false; 57 58 for(int i=_lastCmd;i<=9;i++) 59 { 60 if(cmdCnt[i] < 3) 61 { 62 move(i); 63 bool next=search_aux(_maxDepth,_curDepth+1,i); 64 undo(i); 65 if(next) { ++ans[i]; return true; } 66 } 67 } 68 69 return false; 70 } 71 72 void input() 73 { 74 for(int i=1;i<=9;i++) scanf("%d",dir+i); 75 } 76 77 void search() 78 { 79 for(int i=1;;i++) if(search_aux(i,1,1)) return; 80 } 81 82 void printAns() 83 { 84 for(int i=1;i<=9;i++) 85 while(ans[i]--) printf("%d ",i); 86 } 87 88 int main() 89 { 90 input(); 91 search(); 92 printAns(); 93 return 0; 94 }
Cirno is willing to try this problem (*^__^*)
时间: 2024-11-08 23:10:55