codevs 2449 骑士精神 (IDDfs)

/*
限制步数 写迭代加深 
注意剪枝:当先步数+不同的个数-1>当前限制的步数 就cut 
*/
#include<cstdio>
#include<cstring>
#include<iostream>
#define limit 15
using namespace std;
int T,ans=20,falg;
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_target()
{
    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(falg)return;
    int c=Judge();
    if(now==sum)
      {
          if(c==0)
          ans=sum,falg=1;
        return;
      }
    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_target();
    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++)
            {
                falg=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\n",ans);
        else printf("-1\n");
      }
    return 0;
}

 

posted @ 2016-07-17 19:27  一入OI深似海  阅读(228)  评论(0编辑  收藏  举报