首页 > 代码库 > bzoj1085题解

bzoj1085题解

【解题思路】

  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    void10 #else11     #define Function(type) __attribute__((optimize("-O2"))) inline type12     #define   Procedure    __attribute__((optimize("-O2"))) inline void13 #endif14  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题解