求助,第一次写IDA*,现在输入什么都输出-1,求帮忙看看找一下问题Orz,悬赏两个关注
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int N=10;
int n,ans,stx,sty;
int a[N][N],fx[10]={0,2,2,1,-1,-1,-2,-2,-1,1},fy[10]={0,1,-1,-2,-2,-1,1,2,2};//八个方向,顺时针,东南西北
int Ans[N][N]={{0,0,0,0,0,0},{0,2,2,2,2,2},{0,1,2,2,2,2},{0,1,1,0,2,2},{0,1,1,1,2,2},{0,1,1,1,1,2},{0,1,1,1,1,1}};//要求的状态
string s[N];
bool f;
int h(){//估价
int sum=0;
for(int i=1;i<=5;i++){
for(int j=1;j<=5;j++){
if(a[i][j]!=Ans[i][j]) sum++;//最乐观状态下还差几个
}
}
return sum;
}
void dfs(int x,int y,int dep){
if(dep==ans){
if(!h()){
f=1;//达到目标状态,退出
}
return;
}
for(int i=1;i<=8;i++){
int tox=x+fx[i],toy=y+fy[i];
if(tox<=0||tox>5||toy<=0||toy>5) continue;//越界
swap(a[x][y],a[tox][toy]);
if(h()+dep>ans) continue;//估价超出
dfs(tox,toy,dep+1);//搜索
swap(a[x][y],a[tox][toy]);//回溯
}
}
int main(){
cin>>n;
while(n--){
f=0;
for(int i=1;i<=5;i++){
cin>>s[i];
for(int j=0;j<5;j++){
if(s[i][j]=='0') a[i][j]=1;//白色
else if(s[i][j]=='1') a[i][j]=2;//黑色
else a[i][j]=0,stx=i,sty=j;//空地,也是搜索起点
}
}
for(ans=0;ans<=15;ans++){
//迭代加深
dfs(stx,sty,0);
if(f){
cout<<ans<<endl;//成功
break;
}
}
if(!f)
cout<<-1<<endl;//失败
}
return 0;
}