完美的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;
}
posted @ 2025-04-02 21:35  califeee  阅读(1)  评论(0)    收藏  举报