首页 > 代码库 > 【BZOJ1085】【SCOI2005】骑士精神 [A*搜索]

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

骑士精神

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*搜索]