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

bzoj1085题解

时间:2017-05-30 20:54:37      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:splay   namespace   val   har   attribute   ide   ifd   amp   hid   

【解题思路】

  A*(上下界剪枝)。

  答案上界:15。

  答案下界:当前步数+当前状态剩余步数估价。

  这里我们简单地设计估价函数为当前状态与目标状态不相同的棋子数-1,与0的较大值。这样保证了0≤估价≤正确步数。

  复杂度o(25*C(24,12))。

【参考程序】

技术分享
 1 #include <bits/stdc++.h>
 2 #define range(i,c,o) for(register int i=(c);i<(o);++i)
 3 #define dange(i,c,o) for(register int i=(c);i>(o);--i)
 4 using namespace std;
 5  
 6 //#define __debug
 7 #ifdef  __debug
 8     #define Function(type) type
 9     #define   Procedure    void
10 #else
11     #define Function(type) __attribute__((optimize("-O2"))) inline type
12     #define   Procedure    __attribute__((optimize("-O2"))) inline void
13 #endif
14  
15 static const int INF=0x7f7f7f7f;
16 static const int dx[8]={-2,-2,-1,-1, 1, 1, 2, 2};
17 static const int dy[8]={-1, 1,-2, 2,-2, 2,-1, 1};
18 static const char ED[5][5]=
19 {
20     {‘1‘,‘1‘,‘1‘,‘1‘,‘1‘},
21     {‘0‘,‘1‘,‘1‘,‘1‘,‘1‘},
22     {‘0‘,‘0‘,‘*‘,‘1‘,‘1‘},
23     {‘0‘,‘0‘,‘0‘,‘0‘,‘1‘},
24     {‘0‘,‘0‘,‘0‘,‘0‘,‘0‘},
25 };
26  
27 static const int lim=15;
28 static int ans; char cur[5][5];
29 Function(int) eval()
30 {
31     int ret=0;
32     range(i,0,5) range(j,0,5)
33     {
34         ret+=cur[i][j]!=ED[i][j];
35     }
36     return ret-1;
37 }
38 Procedure find(int&x,int&y)
39 {
40     range(i,0,5) range(j,0,5)
41     {
42         if(cur[i][j]==‘*‘) {x=i,y=j; return;}
43     }
44 }
45 void DFS(const int&steps)
46 {
47     if(steps>lim) return;
48     int x,y,E=eval();
49     if(!~E) return void(ans=min(ans,steps));
50     if(steps+E>min(ans-1,lim)) return;
51     find(x,y);
52     range(i,0,8)
53     {
54         int tx=x+dx[i],ty=y+dy[i];
55         if(tx>=0&&ty>=0&&tx<5&&ty<5)
56         {
57             swap(cur[x][y],cur[tx][ty]);
58             DFS(steps+1);
59             swap(cur[x][y],cur[tx][ty]);
60         }
61     }
62 }
63  
64 static int T;
65 int main()
66 {
67     for(scanf("%d",&T);T--;)
68     {
69         range(i,0,5) range(j,0,5)
70         {
71             while(isspace(cur[i][j]=getchar()));
72         }
73         ans=INF,DFS(0);
74         printf("%d\n",ans<INF?ans:-1);
75     }
76     return 0;
77 }
View Code

 

bzoj1085题解

标签:splay   namespace   val   har   attribute   ide   ifd   amp   hid   

原文地址:http://www.cnblogs.com/spactim/p/6921232.html

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