0503:Cup
カップをAかCのどちらかに集める問題。
最初の移動パターンが2通り、それ以降は
直前に移動した逆を除くと1通りしかないので
カップの動きをトレースした。
#include<iostream> #include<algorithm> #include<vector> #include<stack> #include<string> #include<climits> #include<deque> using namespace std; int m,INF=30000000; stack<int,vector<int> >A,B,C; int func(string p){ int cnt=0; for(int i=0;i<m;i++){ if(B.empty() && (C.empty()||A.empty()))return cnt; if(!A.empty() && (B.empty() || A.top()>=B.top()) && p!="BA"){ B.push(A.top()); A.pop(); cnt++,p="AB"; } if(!B.empty() && (C.empty() || B.top()>=C.top()) && p!="CB"){ C.push(B.top()); B.pop(); cnt++,p="BC"; } if(!B.empty() && (A.empty() || B.top()>=A.top()) && p!="AB"){ A.push(B.top()); B.pop(); cnt++,p="BA"; } if(!C.empty() && (B.empty() || C.top()>=B.top()) && p!="BC"){ B.push(C.top()); C.pop(); cnt++,p="CB"; } } return INF; } int main(void){ int n,ans,s,t; while(cin >> n >> m,n|m){ stack<int,vector<int> >Ain,Bin,Cin; cin >> s; for(int i=0;i<s;i++){ cin >> t; Ain.push(t); } cin >> s; for(int i=0;i<s;i++){ cin >> t; Bin.push(t); } cin >> s; for(int i=0;i<s;i++){ cin >> t; Cin.push(t); } A=Ain,B=Bin,C=Cin; ans=func("CB"); A=Ain,B=Bin,C=Cin; ans=min(ans,func("AB")); A=Ain,B=Bin,C=Cin; ans=min(ans,func("BA")); A=Ain,B=Bin,C=Cin; ans=min(ans,func("BC")); if(ans==INF)cout << -1 << endl; else cout << ans << endl; } return 0; }