为啥我以前辣么流弊又会IDA*又会迭代加深的我自己都不知道呢


那么就是基本的了。

但是有个问题就是迭代加深+IDA*的时候由于估的不准搞得好像要多找几层。。

 

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
const int dx[8]={-2,-2,-1,-1,1,1,2,2};
const int dy[8]={1,-1,2,-2,2,-2,1,-1};
bool B[10][10];
void yu()
{
    B[1][1]=true; B[1][2]=true; B[1][3]=true; B[1][4]=true; B[1][5]=true;
    B[2][1]=false;B[2][2]=true; B[2][3]=true; B[2][4]=true; B[2][5]=true;
    B[3][1]=false;B[3][2]=false;B[3][3]=false;B[3][4]=true; B[3][5]=true;
    B[4][1]=false;B[4][2]=false;B[4][3]=false;B[4][4]=false;B[4][5]=true;
    B[5][1]=false;B[5][2]=false;B[5][3]=false;B[5][4]=false;B[5][5]=false;
}

int ans,kx,ky;bool mp[10][10];
int count()
{
    int ret=0;
    for(int i=1;i<=5;i++)
        for(int j=1;j<=5;j++)
            if(mp[i][j]!=B[i][j])ret++;
    return ret;
}
bool dfs(int k)
{
    if(kx==3&&ky==3)
    {
        if(count()==0){printf("%d\n",k);return true;}
    }
    if(k>=ans)return false;
    
    
    for(int i=0;i<=7;i++)
    {
        int tx=kx+dx[i],ty=ky+dy[i];
        if(tx>0&&tx<=5&&ty>0&&ty<=5)
        {
            swap(mp[kx][ky],mp[tx][ty]);
            swap(kx,tx);swap(ky,ty);
            if(count()+k+1<=ans)
            {
                if(dfs(k+1))return true;
            }
            swap(kx,tx);swap(ky,ty);
            swap(mp[kx][ky],mp[tx][ty]);
        }
    }
    return false;
}
char ss[10];
int main()
{
    freopen("a.in","r",stdin);
    freopen("a.out","w",stdout);
    int T;
    scanf("%d",&T);yu();
    while(T--)
    {
        for(int i=1;i<=5;i++)
        {
            scanf("%s",ss+1);
            for(int j=1;j<=5;j++)
            {
                     if(ss[j]=='0')mp[i][j]=false;
                else if(ss[j]=='1')mp[i][j]=true;
                else kx=i, ky=j, mp[i][j]=false;
            }
        }
        for(ans=0;ans<=15;ans++)
        {
            if(dfs(0))break;
        }
        if(ans==16)printf("-1\n");
    }
    return 0;
}

 

pain and happy in the cruel world.