【链接】
bzoj1085
【解题报告】
IDA*裸题。
#include<cstdio>
#include<algorithm>
using namespace std;
const int flg[8][2]={{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1}};
const char c[6][6]={{},
{'#','1','1','1','1','1'},
{'#','0','1','1','1','1'},
{'#','0','0','*','1','1'},
{'#','0','0','0','0','1'},
{'#','0','0','0','0','0'}};
int T,ans,sx,sy,a[6][6];
inline char Readc()
{
char ch=getchar();
while (ch!='0'&&ch!='1'&&ch!='*') ch=getchar();
return ch;
}
int H()
{
int sum=0;
for (int i=1; i<=5; i++)
for (int j=1; j<=5; j++)
if (a[i][j]!=c[i][j]) sum++;
return sum;
}
bool Check(int x,int y) {return x>0&&x<=5&&y>0&&y<=5;}
bool IDA_star(int dep,int x,int y)
{
if (dep+H()-1>ans) return 0;
if (!H()) return 1;
for (int i=0; i<=7; i++)
if (Check(x+flg[i][0],y+flg[i][1]))
{
swap(a[x][y],a[x+flg[i][0]][y+flg[i][1]]);
bool now=IDA_star(dep+1,x+flg[i][0],y+flg[i][1]);
swap(a[x][y],a[x+flg[i][0]][y+flg[i][1]]);
if (now) return 1;
}
return 0;
}
void Work()
{
for (int i=1; i<=5; i++)
for (int j=1; j<=5; j++)
{
a[i][j]=Readc();
if (a[i][j]=='*') sx=i,sy=j;
}
for (ans=0; ans<=15&&!IDA_star(0,sx,sy); ans++);
if (ans>15) printf("-1"); else printf("%d",ans); putchar(10);
}
int main()
{
freopen("1085.in","r",stdin);
freopen("1085.out","w",stdout);
scanf("%d",&T);
while (T--) Work();
return 0;
}