AOJ 0503 - Cup

http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=0503

問題概要

3つのトレーと大きさの異なるコップを、あるルールの下で動かして、端のトレーにすべてのコップを重ねられる最小手数を求めよ。

うまくできなかったので解説を読んでからやってしまった。

#include<iostream>
#include<cstdlib>
#include<cmath>
#define f(n) ((int)pow(3.0,n)-1)
int A,N,M,S[16];
int v(int n,int m,int g){if(m<=N)return v(n-1,m+1,S[m]==1?g+2*(1-g):g)+abs(g-S[m])*(f(n-1)+1);else return 0;}
int main(){while(1){scanf("%d%d",&N,&M);if(!(N||M))break;for(int i=0;i<3;++i){int t;scanf("%d",&t);for(int j=0;j<t;++j){int u;scanf("%d",&u);S[u]=i;}}A=v(N,1,0);A=std::min(A,f(N)-A);A=A<=M?A:-1;printf("%d\n",A);}return 0;}

※むしゃくしゃしてた。