#include <cstdio>
using namespace std;
const char hnt[]={'0','A','B','C'};
int ks[50],js[50],n,ans=0;
void dfs(int sx,int sy){
if(ks[sx]==sy)return;//如果 圆盘到达了 目的柱子,这是指原来在大圆盘上面的小圆盘,到达 可以到达的柱子位置
//如果当前圆盘没有到达目的柱子位置,则 将上面的小圆盘全部 移动到,除了原来的柱子和目的柱子的 另一个柱子上去
for(int i=sx-1;i>=1;i--)dfs(i,(6-(ks[sx]+sy)));//将上面的圆盘全部移动到非目的柱子上去
//dfs之后,则是先处理最小那个圆盘
printf("move %d from %c to %c\n",sx,hnt[ks[sx]],hnt[sy]);//移动编号为sx的圆盘,从ks[sx]柱子中,移动到目标柱子
ans++;ks[sx]=sy;//移动一次 步数+1
//因为 当前圆盘已经移动到了目的柱子,则ks[sx]=sy
}
int main(){
scanf("%d",&n);
int x,xa;
scanf("%d",&x);for(int i=1;i<=x;i++)scanf("%d",&xa),ks[xa]=1;
scanf("%d",&x);for(int i=1;i<=x;i++)scanf("%d",&xa),ks[xa]=2;
scanf("%d",&x);for(int i=1;i<=x;i++)scanf("%d",&xa),ks[xa]=3;
scanf("%d",&x);for(int i=1;i<=x;i++)scanf("%d",&xa),js[xa]=1;
scanf("%d",&x);for(int i=1;i<=x;i++)scanf("%d",&xa),js[xa]=2;
scanf("%d",&x);for(int i=1;i<=x;i++)scanf("%d",&xa),js[xa]=3;
for(int i=n;i>=1;i--)dfs(i,js[i]);//要从最大 的圆盘编号开始 移动到目标柱子
//每次dfs完之后,则编号为i的圆盘则会移动到目的柱子
printf("%d",ans);
return 0;
}
P1242 新汉诺塔
2019-05-10