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;}
※むしゃくしゃしてた。