luogu_2324 骑士精神

#include<cstdio>
#include<cstring>
#include<iostream>
#define limit 15
using namespace std;
int T,ans=20,flag;
int xx[9]={0,-2,-2,-1,-1,1,1,2,2};
int yy[9]={0,-1,1,-2,2,2,-2,1,-1};
int s[10][7],get[10][10];
int target[10][10];
char si;
void get_t(){
    target[1][1]=1;target[1][2]=1;target[1][3]=1;target[1][4]=1;target[1][5]=1;
    target[2][1]=0;target[2][2]=1;target[2][3]=1;target[2][4]=1;target[2][5]=1;
    target[3][1]=0;target[3][2]=0;target[3][3]=2;target[3][4]=1;target[3][5]=1;
    target[4][1]=0;target[4][2]=0;target[4][3]=0;target[4][4]=0;target[4][5]=1;
    target[5][1]=0;target[5][2]=0;target[5][3]=0;target[5][4]=0;target[5][5]=0;
}
int Judge(){
    int ret=0;
    for(int i=1;i<=5;i++)
      for(int j=1;j<=5;j++){
          if(s[i][j]!=target[i][j])ret++;
    }
    return ret;
}
void DFS(int now,int x,int y,int sum){
    if(flag)return;
    int c=Judge();
    if(now==sum && c==0)flag=1,ans=sum;
    if(now-1+c>sum)return;
    for(int i=1;i<=8;i++){
        int nx=x+xx[i];
        int ny=y+yy[i];
        if(nx>0 && nx<=5 && ny>0 && ny<=5){
            swap(s[x][y],s[nx][ny]);
            DFS(now+1,nx,ny,sum);
            swap(s[x][y],s[nx][ny]);
        }
    }
}
int main(){
    scanf("%d",&T);
    get_t();
    while(T--){
        int x,y;
        for(int i=1;i<=5;i++)
          for(int j=1;j<=5;j++){
            cin>>si;
            if(si=='*'){x=i;y=j;get[i][j]=2;}    
            else get[i][j]=si-'0';
        }
        for(int k=0;k<=limit;k++){
            flag=0; ans=20;
            for(int i=1;i<=5;i++)
            for(int j=1;j<=5;j++)s[i][j]=get[i][j];
            DFS(0,x,y,k);
            if(ans==k)break;
        }
        if(ans<=15)printf("%d ",ans);
        else printf("-1 ");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/codetogether/p/7422543.html