【luogu P2324 [SCOI2005]骑士精神】 题解

题目链接:https://www.luogu.org/problemnew/show/P2324

不懂怎么剪枝,所以说,,我需要氧气。。

第一道A*

 1 // luogu-judger-enable-o2
 2 #include <cstdio>
 3 #include <iostream>
 4 #include <algorithm>
 5 #include <cstring>
 6 #define maxn 10
 7 using namespace std;
 8 int T, ans = 16, mx, sx, sy;
 9 int aim[6][6] = {{0,0,0,0,0,0},
10                  {0,2,2,2,2,2},
11                  {0,1,2,2,2,2},
12                  {0,1,1,0,2,2},
13                  {0,1,1,1,1,2},
14                  {0,1,1,1,1,1}};
15 int dx[8] = {-2,-1,1,2,2,1,-1,-2};
16 int dy[8] = {1,2,2,1,-1,-2,-2,-1};
17 int a[maxn][maxn];
18 inline int h()
19 {
20     int ret = 0;
21     for(int i = 1; i <= 5; i++)
22     for(int j = 1; j <= 5; j++)
23     if(a[i][j] != aim[i][j]) ret++;
24     return ret;
25 }
26 inline bool move(int x, int y)
27 {
28     if(x >= 1 && x <= 5 && y >= 1 && y <= 5) return true;
29     return false; 
30 }
31 void A_star(int now, int x, int y)
32 {
33     if(now > mx) return;
34     int cnt = h();
35     if(cnt == 0)
36     {
37         ans = min(ans, now);
38         return;
39     }
40     if(cnt + now - 1 > mx) return;
41     int nowx, nowy;
42     for(int i = 0; i <= 7; i++)
43     {
44         nowx = x + dx[i];
45         nowy = y + dy[i];
46         if(move(nowx, nowy))
47         {
48             swap(a[nowx][nowy],a[x][y]);
49             A_star(now+1,nowx,nowy);
50             swap(a[nowx][nowy],a[x][y]);
51         }
52     }
53 }
54 int main()
55 {
56     cin.sync_with_stdio(false);
57     cin>>T;
58     while(T--)
59     {
60         char s;
61         ans = 16;
62         memset(a,0,sizeof(a));
63         for(int i = 1; i <= 5; i++)
64         for(int j = 1; j <= 5; j++)
65         {
66             cin>>s;
67             if(s != '*')
68             a[i][j] = s + 1 - '0';
69             if(s == '*')
70             {
71                 a[i][j] = 0;
72                 sx = i;
73                 sy = j;
74             }
75         }
76         for(mx = 1; mx <= 15; mx++)
77         {
78             A_star(0,sx,sy);
79             if(ans == mx) break;
80             
81         }
82         if(ans == 16)
83         {
84             cout<<-1<<endl;
85         }
86         else 
87         {
88             cout<<ans<<endl;
89         }
90     }
91     return 0;
92 }

 

posted @ 2018-05-07 19:57  Misaka_Azusa  阅读(203)  评论(0编辑  收藏  举报
Live2D