为啥我以前辣么流弊又会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 ",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 "); } return 0; }