二进制串的储存是个细节比较多的问题qaq
然后各个位置的查询也有些地方要注意
这次真的是改到吐了qwq
不过我似乎比写了很多exchange的代码短一点(就是时间花的有点久(倒地身亡
1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 #include<algorithm> 6 #include<string> 7 #define ll long long 8 using namespace std; 9 int t[1<<18],fax[1<<18],fay[1<<18],fa[1<<18],y[1<<18],a[20]; 10 bool vis[1<<20]; 11 void cou(int x){ 12 int t1=x/4+1,t2=x%4+1; 13 cout<<t1<<" "<<t2<<" "; 14 } 15 void pr(int x){ 16 if (!fa[x]) return ; 17 pr(fa[x]); 18 cou(fax[x]),cou(fay[x]); 19 cout<<endl; 20 } 21 int main(){ 22 int x; 23 int ch=0,zh=0; 24 for (int i=1;i<=16;++i) scanf ("%1d",&a[i]); 25 for (int i=16;i>=1;--i){ 26 ch<<=1; 27 ch|=a[i]; 28 } 29 for (int i=1;i<=16;++i) scanf ("%1d",&a[i]); 30 for (int i=16;i>=1;--i){ 31 zh<<=1; 32 zh|=a[i]; 33 } 34 t[1]=ch; 35 int h=0,ta=1,q,p; 36 while (h<ta){ 37 int x=t[++h]; 38 vis[x]=1; 39 int flag=0; 40 int to=ch; 41 for (int i=0;i<16;++i){ 42 if (i<12) { 43 if ((x&(1<<i))&&(!(x&(1<<i+4)))) to=x&(~(1<<i)),to|=(1<<i+4); 44 else if ((x&(1<<i+4))&&(!(x&(1<<i)))) to=x&(~(1<<i+4)),to|=(1<<i); 45 if (!vis[to]) t[++ta]=to,vis[to]=1,fa[to]=x,fax[to]=i,fay[to]=i+4,y[to]=y[x]+1; 46 } 47 if (to==zh){flag=1;break;} 48 if (i!=3&&i!=7&&i!=11&&i!=15){ 49 if ((x&(1<<i))&&(!(x&(1<<i+1)))) to=x&(~(1<<i)),to|=(1<<i+1); 50 else if ((x&(1<<i+1))&&(!(x&(1<<i)))) to=x&(~(1<<i+1)),to|=(1<<i); 51 if (!vis[to]) t[++ta]=to,vis[to]=1,fa[to]=x,fax[to]=i,fay[to]=i+1,y[to]=y[x]+1; 52 } 53 if (to==zh){flag=1;break;} 54 } 55 if (flag) {q=to;break;} 56 } 57 cout<<y[q]<<endl; 58 pr(q); 59 return 0; 60 }
时间: 2024-12-24 16:34:13