IDA*WA0求调,全输出-1,能过样例
查看原帖
IDA*WA0求调,全输出-1,能过样例
530468
_determination_楼主2024/1/13 17:20
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define debug puts("IAKIOI")
#define inf (int)1e18
using namespace std;
int now[6][6],mb[6][6],x,y;
int h()
{
    int ans=0;
    for ( int i = 1 ; i <= 5 ; i++ )
    {
        for ( int j = 1 ; j <= 5 ; j++ )
        {
            ans+=mb[i][j]!=now[i][j];
        }
    }
    return ans;
}
int xx[8]={-2,-2,-1,1,2,2,1,-1};
int yy[8]={-1,1,2,2,1,-1,-2,-2};
int in(int x,int y)
{
    return 1<=x&&x<=5&&1<=y&&y<=5;
}
int suc;
void ida(int dep,int maxdep)
{
    if(dep==maxdep&&h()!=0)
    {
        return;
    }
    if(h()==0)
    {
        suc=1;
        return ;
    }
    if(suc==1)
    {
        return;
    }
    int ans=inf;
    for ( int i = 0 ; i < 8 ; i++ )
    {
        int nx=x+xx[i];
        int ny=y+yy[i];
        if(in(nx,ny))
        {
            swap(now[x][y],now[nx][ny]);
            x=nx,y=ny;
            if(dep+h()<=maxdep)
            {
                ida(dep+1,maxdep);
            }
            x=nx-xx[i];
            y=ny-yy[i];
            swap(now[x][y],now[nx][ny]);
        }
    }
    return ;
}
void sol()
{
    suc=0;
    for ( int i = 1 ; i <= 5 ; i++ )
    {
        getchar();
        for ( int j = 1 ; j <= 5 ; j++ )
        {
            char ch=getchar();
            if(ch=='*')
            {
                now[i][j]=2;
                x=i;
                y=j;
            }else{
                now[i][j]=ch-'0';
            }
        }
    }
    for ( int i = 1 ; i <= 5 ; i++ )
    {
        for ( int j = 1 ; j <= 5 ; j++ )
        {
            //cout << now[i][j];
        }
        //cout << endl;
    }
    for ( int i = 1 ; i <= 15 ; i++ )
    {
        ida(0,i);
        if(suc)
        {
            cout << i << endl;
            return;
        }
    }
    cout << -1 << endl;
}
signed main()
{
    mb[1][1]=mb[1][2]=mb[1][3]=mb[1][4]=mb[1][5]=1;
    mb[2][2]=mb[2][3]=mb[2][4]=mb[2][5]=1;
    mb[3][4]=mb[3][5]=mb[4][5]=1;
    mb[3][3]=2;
    int T;
    cin >> T;
    while(T--)
    {
        sol();
    }
	return 0;
}
2024/1/13 17:20
加载中...