#include<bits/stdc++.h>
using namespace std;
char si[8][8],ans[8][8];//存输入数据
int fa[200005],dp[200005],x[100005*4],cur;//fa用来记录上一个状态的二进制值,dp用来记录到达这个状态所需的步骤数,x记录答案(整个转移的过程)(感觉数组够大了,为什么re了)
int main(){
for(int i=1;i<=4;++i){
for(int j=1;j<=4;++j){
cin>>si[i][j];
}
}
for(int i=1;i<=4;++i){
for(int j=1;j<=4;++j){
cin>>si[i][j];
}
}
queue<int> que;
int temp=0,a=0;
for(int i=1;i<=4;++i){
for(int j=1;j<=4;++j){
temp=temp*2+si[i][j]-'0';
a=a*2+ans[i][j]-'0';
}
}
que.push(temp);
fa[temp]=-1;
dp[temp]=0;
while(!que.empty()){
int q=que.front();
que.pop();
int now[8][8]={0};
for(int i=15;i>=0;--i){
if((1<<i)&q){
now[4-i/4][4-i%4]=1;
}
}
for(int i=1;i<=4;++i){
for(int j=1;j<=4;++j){
if(i!=4){
swap(now[i][j],now[i+1][j]);
int temp=0;
for(int ii=1;ii<=4;++ii){
for(int jj=1;jj<=4;++jj){
temp=temp*2+now[ii][jj];
}
}
swap(now[i][j],now[i+1][j]);
if(!fa[temp]){
que.push(temp);
fa[temp]=q;
dp[temp]=dp[q]+1;
}
}
temp=0;
if(j!=4){
swap(now[i][j],now[i][j+1]);
for(int ii=1;ii<=4;++ii){
for(int jj=1;jj<=4;++jj){
temp=temp*2+now[ii][jj];
}
}
swap(now[i][j],now[i][j+1]);
if(!fa[temp]){
que.push(temp);
fa[temp]=q;
dp[temp]=dp[q]+1;
}
}
}
}
}
int kkk=a;
cout<<dp[a]<<"\n";
while(fa[a]!=-1){
int now[8][8]={0};
for(int i=15;i>=0;--i){
if((1<<i)&a){
now[4-i/4][4-i%4]=1;
}
}
/*cout<<'#'<<"\n";
for(int i=1;i<=4;++i){
for(int j=1;j<=4;++j){
cout<<now[i][j];
}
cout<<"\n";
}
*/
int f[8][8]={0};
for(int i=15;i>=0;--i){
if((1<<i)&fa[a]){
f[4-i/4][4-i%4]=1;
}
}
for(int i=1;i<=4;++i){
for(int j=1;j<=4;++j){
if(now[i][j]!=f[i][j]){
x[++cur]=i;
x[++cur]=j;
}
}
}
a=fa[a];
}
for(int i=dp[kkk];i>=1;--i){
for(int j=4*i-3;j<=4*i;++j){
cout<<x[j];
}
cout<<"\n";
}
return 0;
}
所有点都re了(蒟蒻救助)