搜索复杂度估计:状态数*状态转移(因为会记录下已经搜索过的状态,防止重复搜索)
输出路径的时候需要递归输出,这里将这些所有信息包含一个结构体中方便输出
#include<bits/stdc++.h>
using namespace std;
struct one{
int now;
int last;
int pos;
int way;
int step;
};
one a[1<<16];
bool vis[1<<16];
queue<one> q;
int beg,endd;
int change(one x,int pos,int way)
{
if(pos+way>15)
return -1;
int a=x.now&(1<<pos);
int b=x.now&(1<<(pos+way));
if(a==b)
return -1;
int p=x.now^(1<<pos);
p=p^(1<<(pos+way));
return p;
}//位运算处理二进制
void putout(one x)
{
if(x.last==0)
{
return ;
}
putout(a[x.last]);
cout<<(4-x.pos/4)<<(4-x.pos%4)<<(4-(x.pos+x.way)/4)<<(4-((x.pos+x.way)%4))<<"\n";
}
int main ()
{
char c;
for(int i=0;i<16;++i)
{
cin>>c;
if(c=='1')
beg+=(1<<(15-i));
}
for(int i=0;i<16;++i)
{
cin>>c;
if(c=='1')
endd+=(1<<(15-i));
}
q.push((one){beg,0,0,0,0});
one noww;
int f=0;
while(!q.empty())
{
if(f)
break;
noww=q.front();
a[noww.now]=noww;
vis[noww.now]=1;
q.pop();
int z;
for(int i=0;i<12;++i)
{
z=change(noww,i,4);
if(z!=-1)
{
if(vis[z])
continue;
q.push((one){z,noww.now,i,4,noww.step+1});
vis[z]=1;
}
if(z==endd)
{
cout<<noww.step+1<<"\n";
a[z]=(one){z,noww.now,i,4,noww.step+1};
putout(a[z]);
f=1;
break;
}
}
for(int i=0;i<16;++i)
{
if(i%4==3)
continue;
z=change(noww,i,1);
if(z!=-1)
{
if(vis[z])
continue;
q.push((one){z,noww.now,i,1,noww.step+1});
vis[z]=1;
}
if(z==endd)
{
cout<<noww.step+1<<"\n";
a[z]=(one){z,noww.now,i,1,noww.step+1};
putout(a[z]);
f=1;
break;
}
}
}
return 0;
}