天天看点

bzoj1085

。。。。。

#include<cstdio>

#include<cstring>

#include<iostream>

#include<algorithm>

using namespace std;

const int dx[8]={1,1,2,2,-1,-1,-2,-2};

const int dy[8]={2,-2,1,-1,2,-2,1,-1};

char mbiao[6][6];    

int pan(char a[6][6],int s)

{

int ans=0;

for (int i=1;i<=5;i++)

for (int j=1;j<=5;j++){

if (a[i][j]!=mbiao[i][j])ans++;

}

if (ans==0)return -1;

if ((ans-1)+s<=15)return 1;

return 0;

}

bool bk=true;int minn=99999999,cc=0;

void dg(char a[6][6],int ss,int x,int y)

{

//cc++;printf("%d\n",cc);

if (ss>minn)return ;

if (ss>15)return ;

int tt=pan(a,ss);

if (tt==-1){bk=false,minn=min(ss,minn);return ;}

if (tt==1){

for (int i=0;i<=7;i++){

int tx,ty;

tx=x+dx[i],ty=y+dy[i];

if (tx>=1 && tx<=5 && ty>=1 && ty<=5){

swap(a[tx][ty],a[x][y]);

dg(a,ss+1,tx,ty);

swap(a[tx][ty],a[x][y]);

}

}

}

}

int main()

{

freopen("knight.in","r",stdin);

freopen("knight.out","w",stdout);

mbiao[1][1]=1;mbiao[1][2]=1;mbiao[1][3]=1;mbiao[1][4]=1;mbiao[1][5]=1;

mbiao[2][1]=0;mbiao[2][2]=1;mbiao[2][3]=1;mbiao[2][4]=1;mbiao[2][5]=1;

    mbiao[3][1]=0;mbiao[3][2]=0;mbiao[3][3]=2;mbiao[3][4]=1;mbiao[3][5]=1;

    mbiao[4][1]=0;mbiao[4][2]=0;mbiao[4][3]=0;mbiao[4][4]=0;mbiao[4][5]=1;

    mbiao[5][1]=0;mbiao[5][2]=0;mbiao[5][3]=0;mbiao[5][4]=0;mbiao[5][5]=0;

int tt,x,y;scanf("%d",&tt);char a[6][6];

while (tt--){

minn=99999999;

bk=true;

char ss[1100];

for (int i=1;i<=5;i++){

scanf("%s",ss+1);

for (int j=1;j<=5;j++){

if (ss[j]=='0')     a[i][j]=0;

else if (ss[j]=='1')a[i][j]=1;

else               a[i][j]=2,x=i,y=j;

}

}

dg(a,0,x,y);

if (bk)printf("-1\n");

else printf("%d\n",minn);

}

return 0;

}