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

【BZOJ1085】【SCOI2005】骑士精神 [A*搜索]

时间:2017-05-09 09:32:57      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:long   span   line   open   技术   bbs   eval   ref   one   

骑士精神

Time Limit: 10 Sec  Memory Limit: 162 MB
[Submit][Status][Discuss]

Description

  在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位。
  在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空位上。
  给定一个初始的棋盘,怎样才能经过移动变成如下目标棋盘: 为了体现出骑士精神,他们必须以最少的步数完成任务。

  技术分享

Input

  第一行有一个正整数T(T<=10),表示一共有N组数据。接下来有T个5×5的矩阵,0表示白色骑士,1表示黑色骑士,*表示空位。两组数据之间没有空行。

Output

  对于每组数据都输出一行。如果能在15步以内(包括15步)到达目标状态,则输出步数,否则输出-1。

Sample Input

  2
  10110
  01*11
  10111
  01001
  00000

  01011
  110*1
  01110
  01010
  00100

Sample Output

  7
  -1

HINT

  Ans<=15

Solution

  看到这题,我们没有什么思路,只能运用搜索,然后把错位的个数当做估价,跑一遍A*就可以了。

Code

技术分享
 1 #include<iostream>  
 2 #include<string>  
 3 #include<algorithm>  
 4 #include<cstdio>  
 5 #include<cstring>  
 6 #include<cstdlib>  
 7 #include<cmath>
 8 using namespace std;
 9 typedef long long s64;
10 
11 const int ONE = 1001;
12 
13 int T;
14 int a[8][8],Step,Vx,Vy;
15 char ch[8];
16 bool PD;
17 int dx[]={1,2,-1,-2,1,2,-1,-2};
18 int dy[]={2,1,2,1,-2,-1,-2,-1};
19 int Goal[6][6]=
20 {
21     {0,0,0,0,0,0},
22     {0,1,1,1,1,1},
23     {0,0,1,1,1,1},
24     {0,0,0,2,1,1},
25     {0,0,0,0,0,1},
26     {0,0,0,0,0,0}
27 };
28 
29 inline int get()
30 {
31         int res=1,Q=1;  char c;
32         while( (c=getchar())<48 || c>57)
33         if(c==-)Q=-1;
34         if(Q) res=c-48; 
35         while((c=getchar())>=48 && c<=57) 
36         res=res*10+c-48;
37         return res*Q; 
38 }
39 
40 int Evaluation()
41 {
42         int res = 0;
43         for(int i=1;i<=5;i++)
44         for(int j=1;j<=5;j++)
45             if(a[i][j] != Goal[i][j])
46             res++;
47         return res;
48 }
49 
50 void Dfs(int T,int x,int y)
51 {
52         if(PD) return;
53         if(T == Step)
54         {
55             PD = !Evaluation();
56             return;
57         }
58         
59         for(int i=0;i<8;i++)
60         {
61             int Nx = x+dx[i], Ny = y+dy[i];
62             if(!(1<=Nx && Nx<=5 && 1<=Ny && Ny<=5)) continue;
63             swap(a[x][y], a[Nx][Ny]);
64         /*    if(Evaluation() + T <= Step) */Dfs(T+1, Nx,Ny);
65             swap(a[x][y], a[Nx][Ny]);
66         }
67 }
68 
69 void Solve()
70 {
71         for(int i=1;i<=5;i++)
72         {
73             scanf("%s",ch+1);
74             for(int j=1;j<=5;j++)
75             {
76                 if(ch[j] == *) {a[i][j] = 2, Vx=i,Vy=j;}
77                 else a[i][j] = ch[j]-0;
78             }
79         }
80         
81         PD=0;
82         for(Step=1;Step<=15;Step++)
83         {
84             Dfs(0,Vx,Vy);
85             if(PD) break;
86         }
87         
88         printf("%d\n",PD==1 ? Step:-1);
89 }
90 
91 int main()
92 {
93         T=get();
94         while(T--)
95             Solve();
96 }
View Code

 

【BZOJ1085】【SCOI2005】骑士精神 [A*搜索]

标签:long   span   line   open   技术   bbs   eval   ref   one   

原文地址:http://www.cnblogs.com/BearChild/p/6828936.html

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