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;
}