分析:因为n很小,可以逐一搜索,用一个队列将每种情况列出来,用bfs寻找从s到t的最短路径
#include <bits/stdc++.h>
using namespace std;
int n;
string s, t;
map<string, int> dis;
void bfs() {
dis[s] = 0;
queue<string> q;
q.push(s);
while (q.size()) {
string u = q.front();
q.pop();
int k;
for (int i = 0; i < n + 1; i++)
if (u[i] == '.') {
k = i;
break;
}
for (int i = 0; i < n + 1; i++)
if (u[i] != '.' && u[i + 1] != '.') {
string v;
if(i<k)v=u.substr(0,i)+u.substr(k,2)+u.substr(i+2,k-i-2)+u.substr(i,2)+u.substr(k+2);
else v=u.substr(0,k)+u.substr(i,2)+u.substr(k+2,i-k-2)+u.substr(k,2)+u.substr(i+2);
if (!dis.count(v)) {
dis[v] = dis[u] + 1;
q.push(v);
}
}
}
}
int main() {
scanf("%d", &n);
cin >> s >> t;
s += "..", t += "..";
bfs();
printf("%d\n", !dis.count(t) ? -1 : dis[t]);
return 0;
}