HDU 1997 汉诺塔VII

题目链接: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
");
		}
	}
}
原文地址:https://www.cnblogs.com/jackwuyongxing/p/4554681.html