码迷,mamicode.com
首页 > 其他好文 > 详细

IOI1994 北京2008的挂钟 迭代加深

时间:2016-04-10 12:55:38      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:

总的来讲,这是一道很⑨的题,因为:

(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 (*^__^*)

 

IOI1994 北京2008的挂钟 迭代加深

标签:

原文地址:http://www.cnblogs.com/Onlynagesha/p/5373805.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!