题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1085
搜索,IDA*,估价就是最少需要跳的步数;
代码意外地挺好写的,memcmp 用起来好方便啊。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int goal[][]=
{{,,,,},
{,,,,},
{,,,,},
{,,,,},
{,,,,}};
int dx[]={,-,,-,,-,,-},dy[]={,-,-,,,-,-,},T,a[][],ans,k;
bool fl;
bool pd(int dep)
{
int cnt=;
for(int i=;i<;i++)
for(int j=;j<;j++)
if(a[i][j]!=goal[i][j])cnt++;
return cnt+dep<=k;
}
void dfs(int dep,int x,int y)
{
if(dep==k&&memcmp(goal,a,sizeof a)==)
{
fl=; return;
}
for(int i=;i<;i++)
{
if(fl||dep>=k)return;//
int xx=x+dx[i],yy=y+dy[i];
if(xx<||yy<||xx>||yy>)continue;//!
swap(a[x][y],a[xx][yy]);
if(pd(dep))dfs(dep+,xx,yy);
swap(a[x][y],a[xx][yy]);
}
}
int main()
{
scanf("%d",&T);
while(T--)
{
char ch[]; fl=;
int si,sj;
for(int i=;i<;i++)
{
scanf("%s",&ch);
for(int j=;j<;j++)
if(ch[j]=='*')a[i][j]=,si=i,sj=j;
else a[i][j]=ch[j]-'';
}
for(k=;k<=;k++)
{
dfs(,si,sj);//
if(fl)break;
}
if(!fl)printf("-1\n");
else printf("%d\n",k);
}
return ;
}