完美的3进制状压问题
完美的3进制状压问题
D - Go Stone Puzzle
https://atcoder.jp/contests/abc361/tasks/abc361_d
rating:1157
评述
头一次看tourist的代码,实在是在美了
代码
#include <bits/stdc++.h>
signed main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout<<std::setiosflags(std::ios::fixed)<<std::setprecision(2);
int n;
std::string s,t;
std::cin>>n>>s>>t;
n+=2;
std::vector<int> p3(n+1);
p3[0]=1;
for(int i=1;i<=n;i++){
p3[i]=p3[i-1]*3;
}
std::vector<int> dist(p3[n],-1);
int init=0,goal=0;
for(int i=0;i<n;i++){
init=init*3+(i<n-2?(s[i]=='W'?1:2):0);
goal=goal*3+(i<n-2?(t[i]=='W'?1:2):0);
}
std::vector<int> que(1,init);
dist[init]=0;
std::vector<int> state(n);
for(int it=0;it<int(que.size());it++){
int tmp=que[it];
for(int i=n-1;i>=0;i--){
state[i]=tmp%3;
tmp/=3;
}
int empty=int(std::find(state.begin(),state.end(),0)-state.begin());
for(int i=0;i<n-1;i++){
if(state[i]!=0&&state[i+1]!=0){
auto new_state=state;
std::swap(new_state[i],new_state[empty]);
std::swap(new_state[i+1],new_state[empty+1]);
int to=0;
for(int j=0;j<n;j++){
to=to*3+new_state[j];
}
if(dist[to]==-1){
que.push_back(to);
dist[to]=dist[que[it]]+1;
}
}
}
}
std::cout<<dist[goal]<<'\n';
return 0;
}