隨便寫個迭代A*搜一下就可以過了
#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>#include<cmath>#include<ctime>#include<algorithm>#include<iomanip>#include<vector>#include<stack>#include<queue>#include<map>#include<set>#include<bitset>using namespace std;#define MAXN 1010#define MAXM 1010#define ll long long#define INF 1000000000#define MOD 1000000007#define eps 1e-8struct data{int f;int g;int d;data(){}data(int _d,int _f);friend bool operator <(data x,data y){return x.f+x.g>y.f+y.g;}};char s[5];int S,T,D;int mi[20];int dis[1000010];int tim;priority_queue<data>q;data::data(int _d,int _f){d=_d;f=_f;g=0;int t=d^T;int i;for(i=0;i<16;i++){if(mi[i]&t){g++;}}}int read(){int i,j;int re=0;int now=1;for(i=1;i<=4;i++){scanf("%s",s+1);for(j=1;j<=4;j++){re+=(s[j]=='1')*mi[(i-1)*4+j-1];now<<=1;}}return re;}bool search(){int i;data x;q.push(data(S,0));memset(dis,0x3f,sizeof(dis));dis[S]=0;while(!q.empty()){x=q.top();q.pop();if(x.d==T){return 1;}if(x.f==D){continue ;}for(i=0;i<12;i++){if((x.d&mi[i])&&!(x.d&mi[i+4])){int t=x.d^mi[i]^mi[i+4];if(dis[t]>x.f+1){dis[t]=x.f+1;q.push(data(t,x.f+1));}}}for(i=4;i<16;i++){if((x.d&mi[i])&&!(x.d&mi[i-4])){int t=x.d^mi[i]^mi[i-4];if(dis[t]>x.f+1){dis[t]=x.f+1;q.push(data(t,x.f+1));}}}for(i=0;i<16;i++){if(i==3||i==7||i==11||i==15){continue ;}if((x.d&mi[i])&&!(x.d&mi[i+1])){int t=x.d^mi[i]^mi[i+1];if(dis[t]>x.f+1){dis[t]=x.f+1;q.push(data(t,x.f+1));}}}for(i=0;i<16;i++){if(i==0||i==4||i==8||i==12){continue ;}if((x.d&mi[i])&&!(x.d&mi[i-1])){int t=x.d^mi[i]^mi[i-1];if(dis[t]>x.f+1){dis[t]=x.f+1;q.push(data(t,x.f+1));}}}}return 0;}int main(){int i;mi[0]=1;for(i=1;i<16;i++){mi[i]=mi[i-1]<<1;}S=read();T=read();for(D=0;;D++){if(search()){printf("%d\n",D);return 0;}}return 0;}/*11110000111000101010010110100101*/