题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1997
该题的解题思路是递归,如同递归解决汉诺塔问题本身一样。
本题的目标是将n个盘从a柱移动到c柱,如果n盘在a柱上,那么该移动序列应该处于将n-1个盘从a柱移动到b柱上,如果n盘在c柱上,那么该序列处于将n-1个盘从b柱移动到c柱上。于是乎,这就可以将其进一步看成n-1个盘的子问题。
#include<iostream> #include<cstdio> using namespace std; bool p[3][64]; void init(){ for(int i=0;i<3;i++){ for(int j=0;j<64;j++){ p[i][j]=false; } } } bool dfs(int n,int src,int by,int des){ // printf("%d discs move from %d by %d to %d ",n,src,by,des); if(n==1){ if(p[src][n]){ // printf("%d disc at %d ",n,src); return true; }else if(p[des][n]){ // printf("%d disc at %d ",n,des); return true; }else{ // printf("error at disc %d ",n); return false; } } if(p[src][n]){ // printf("%d disc at %d ",n,src); return dfs(n-1,src,des,by); }else if(p[des][n]==true){ // printf("%d disc at %d ",n,des); return dfs(n-1,by,src,des); }else{ // printf("error at disc %d ",n); return false; } } int main(){ int t; scanf("%d",&t); while(t--){ int num; init(); scanf("%d",&num); int n1,n2,n3; scanf("%d",&n1); for(int i=0;i<n1;i++){ int v; scanf("%d",&v); p[0][v]=true; } scanf("%d",&n2); for(int i=0;i<n2;i++){ int v; scanf("%d",&v); p[1][v]=true; } scanf("%d",&n3); for(int i=0;i<n3;i++){ int v; scanf("%d",&v); p[2][v]=true; } if(dfs(num,0,1,2)){ printf("true "); }else{ printf("false "); } } }