标签:
题目链接: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",n,src,by,des);
if(n==1){
if(p[src][n]){
// printf("%d disc at %d\n",n,src);
return true;
}else if(p[des][n]){
// printf("%d disc at %d\n",n,des);
return true;
}else{
// printf("error at disc %d\n",n);
return false;
}
}
if(p[src][n]){
// printf("%d disc at %d\n",n,src);
return dfs(n-1,src,des,by);
}else if(p[des][n]==true){
// printf("%d disc at %d\n",n,des);
return dfs(n-1,by,src,des);
}else{
// printf("error at disc %d\n",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\n");
}else{
printf("false\n");
}
}
}
标签:
原文地址:http://www.cnblogs.com/jackwuyongxing/p/4554681.html