0190:Eleven Puzzle
問題文
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0190
双方向bfsで解いた。
#include<iostream> #include<vector> #include<algorithm> #include<map> #include<queue> using namespace std; map<vector<int>,int>mp,used; struct State{ vector<int>v; int t; State(vector<int>v,int t):v(v),t(t){} }; vector<vector<int> > generate(vector<int> v){ vector<vector<int> >res; for(int i=0;i<13;i++){ if(v[i]==0){ vector<int>tmp=v; switch(i){ case 0: swap(tmp[0],tmp[2]); res.push_back(tmp); break; case 1: swap(tmp[1],tmp[2]); res.push_back(tmp); swap(tmp[1],tmp[2]); swap(tmp[1],tmp[5]); res.push_back(tmp); break; case 2: swap(tmp[2],tmp[0]); res.push_back(tmp); swap(tmp[2],tmp[0]); swap(tmp[2],tmp[1]); res.push_back(tmp); swap(tmp[2],tmp[1]); swap(tmp[2],tmp[3]); res.push_back(tmp); swap(tmp[2],tmp[3]); swap(tmp[2],tmp[6]); res.push_back(tmp); break; case 3: swap(tmp[3],tmp[2]); res.push_back(tmp); swap(tmp[3],tmp[2]); swap(tmp[3],tmp[7]); res.push_back(tmp); break; case 4: swap(tmp[4],tmp[5]); res.push_back(tmp); break; case 5: swap(tmp[5],tmp[1]); res.push_back(tmp); swap(tmp[5],tmp[1]); swap(tmp[5],tmp[4]); res.push_back(tmp); swap(tmp[5],tmp[4]); swap(tmp[5],tmp[6]); res.push_back(tmp); swap(tmp[5],tmp[6]); swap(tmp[5],tmp[9]); res.push_back(tmp); break; case 6: swap(tmp[6],tmp[2]); res.push_back(tmp); swap(tmp[6],tmp[2]); swap(tmp[6],tmp[5]); res.push_back(tmp); swap(tmp[6],tmp[5]); swap(tmp[6],tmp[7]); res.push_back(tmp); swap(tmp[6],tmp[7]); swap(tmp[6],tmp[10]); res.push_back(tmp); break; case 7: swap(tmp[7],tmp[3]); res.push_back(tmp); swap(tmp[7],tmp[3]); swap(tmp[7],tmp[6]); res.push_back(tmp); swap(tmp[7],tmp[6]); swap(tmp[7],tmp[8]); res.push_back(tmp); swap(tmp[7],tmp[8]); swap(tmp[7],tmp[11]); res.push_back(tmp); break; case 8: swap(tmp[8],tmp[7]); res.push_back(tmp); break; case 9: swap(tmp[9],tmp[5]); res.push_back(tmp); swap(tmp[9],tmp[5]); swap(tmp[9],tmp[10]); res.push_back(tmp); break; case 10: swap(tmp[10],tmp[6]); res.push_back(tmp); swap(tmp[10],tmp[6]); swap(tmp[10],tmp[9]); res.push_back(tmp); swap(tmp[10],tmp[9]); swap(tmp[10],tmp[11]); res.push_back(tmp); swap(tmp[10],tmp[11]); swap(tmp[10],tmp[12]); res.push_back(tmp); break; case 11: swap(tmp[11],tmp[7]); res.push_back(tmp); swap(tmp[11],tmp[7]); swap(tmp[11],tmp[10]); res.push_back(tmp); break; case 12: swap(tmp[12],tmp[10]); res.push_back(tmp); break; } } } return res; } void bfs(void){ queue<State>que; vector<int>s; for(int i=0;i<12;i++)s.push_back(i); s.push_back(0); que.push(State(s,0)); while(!que.empty()){ State now=que.front(); que.pop(); if(mp.count(now.v) && now.t>=mp[now.v])continue; if(now.t>=12)continue; mp[now.v]=now.t; vector<vector<int> >res=generate(now.v); for(int i=0;i<res.size();i++){ que.push(State(res[i],now.t+1)); } } } int bfs(vector<int> s){ used.clear(); queue<State>que; que.push(State(s,0)); while(!que.empty()){ State now=que.front(); que.pop(); if(now.t>=11)continue; if(used.count(now.v))continue; if(mp.count(now.v))return now.t+mp[now.v]; used[now.v]=1; vector<vector<int> >res=generate(now.v); for(int i=0;i<res.size();i++){ que.push(State(res[i],now.t+1)); } } return -1; } int main(void){ bfs(); while(true){ vector<int>s(13); for(int i=0;i<13;i++){ cin >> s[i]; if(s[i]<0)return 0; } int res=bfs(s); if(res<0 || res>20)cout << "NA" << endl; else cout << res << endl; } return 0; }