写挂了 明天再改 困困————
思路就是 双向BFS 找到后直接再反向找路径 和 ACW 1076. 迷宫问题 非常的相似
但是想不明白啊!
字典序最小咋做啊!
```
#include <bits/stdc++.h> using namespace std; const int N = 1e3+10; const int M = 1e4+10; const int mod =100003; #define int long long #define endl '\n' #define Endl '\n' #define inf 1e18 #define fast ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr); string A,B; int dx[4]={+3,+1,-1,-3}; vector<int>v; vector<int>ans; int extend(queue<string>&q,unordered_map<string,int>&da,unordered_map<string,int>&db,queue<string>q2){ int d=da[q.front()]; while(q.size()&&da[q.front()]==d){ auto t=q.front(); q.pop(); for(int i=0;i<9;i++){ if(t[i]=='0'){ for(int j=0;j<4;j++){ int x=dx[j]+i; if((i==2||i==5)&&j==1)continue; if((i==3||i==6)&&j==2)continue; if(x>=0&&x<9){ string r=t; swap(r[x],r[i]); if(db.count(r)){ da[r]=da[t]+1; while(q.size())q.pop(); q.push(r); while(q.size()){ auto t=q.front(); q.pop(); for(int k=0;k<9;k++){ if(t[k]=='0') { for (int m = 0; m < 4; m++) { int x = dx[m] + k; if ((k == 2 || k == 5) && m == 1)continue; if ((k == 3 || k == 6) && m == 2)continue; if(x>=0&&x<9){ string r=t; swap(r[x],r[i]); if(da[r]==da[t]-1){ q.push(r); v.push_back(m); } } } } } } while(q2.size())q2.pop(); q2.push(r); while(q2.size()){ auto t=q2.front(); q2.pop(); for(int k=0;k<9;k++){ if(t[k]=='0') { for (int m = 0; m < 4; m++) { int x = dx[m] + k; if ((k == 2 || k == 5) && m == 1)continue; if ((k == 3 || k == 6) && m == 2)continue; if(x>=0&&x<9){ string r=t; swap(r[x],r[i]); if(db[r]==db[t]-1){ q2.push(r); ans.push_back(m); } } } } } } return da[t]+db[r]+1; } if(da.count(r))continue; da[r]=da[t]+1; q.push(r); } } break; } } } return -1; } int bfs(){ unordered_map<string,int>da,db; queue<string>qa,qb; qa.push(A),qb.push(B); da[A]=db[B]=0; while(qa.size()&&qb.size()){ int t; if(qa.size()<=qb.size())t=extend(qa,da,db,qb); else t=extend(qb,db,da,qa); if(t!=-1)return t; } } signed main(){ fast int t;cin>>t; int cnt=0; while(t--) { cnt++; cin >> A >> B; if (A == B) { cout << 0 << endl; return 0; } for(int i=0;i<A.size();i++){ if(A[i]=='X')A[i]='0'; if(B[i]=='X')B[i]='0'; } cout <<"Case "<<cnt<<": "<< bfs() << endl; for(int i=v.size()-1;i>=0;i--){ if(v[i]==0)cout<<'d'; if(v[i]==1)cout<<'l'; if(v[i]==2)cout<<'r'; if(v[i]==3)cout<<'u'; } for(int i=0;i<ans.size();i++){ if(ans[i]==0)cout<<'d'; if(ans[i]==1)cout<<'l'; if(ans[i]==2)cout<<'r'; if(ans[i]==3)cout<<'u'; } cout<<endl; ans.clear(); v.clear(); } return 0^0; }
```