💨
ABC361D
問題
解法
連続した空白マス 2つを 1マスとみなすと,順列は高々
もちろん,ルール上到達出来ない配置も含んでいる.
ここで,
あとは BFS をすれば良い.遷移は
コード
main.cpp
int main() {
ll n;
cin >> n;
string s; cin >> s;
string t; cin >> t;
rep(i,2) s.push_back('.'), t.push_back('.');
map<string, ll> dis;
queue<string> que;
auto push = [&](ll d, string str) -> void {
if(dis.find(str) == dis.end()){
dis[str] = d;
que.push(str);
}
};
push(0, s);
while(que.size()){
auto cv = que.front(); que.pop();
ll cd = dis[cv];
ll hole = -1; // index
rep(i,n+1){
if(cv[i] == '.' && cv[i+1] == '.') {
hole = i;
break;
}
}
// swap
rep(i,n+1) if(cv[i] != '.' && cv[i+1] != '.'){
swap(cv[i], cv[hole]); swap(cv[i+1], cv[hole+1]);
push(cd+1, cv);
swap(cv[i], cv[hole]); swap(cv[i+1], cv[hole+1]);
}
}
cout << (dis.find(t) == dis.end() ? -1: dis[t]) << endl;
return 0;
}
Discussion