hdu 1997 汉诺塔vii

mac2022-06-30  35

做了这道题目,才让我回味起了acm最初始的快乐,那就是将一个事物的本质想清楚了之后,能很清晰的看清楚。。。

稍微说一下解这道题目的解题思路吧。。

现在我们有n个盘子,然后我们想把这些盘子从A上面移到C盘上去,那么第n个盘子应该是最后一次的移动,所以第n个盘子只可能出现在A和C盘上,OK。。那么如果现在你知道了第n个盘子在哪里,能不能确定n-1个盘子不能出现在哪个盘子。

View Code 1   #include<iostream> 2   using namespace std; 3   int num[3][65],head[3]; 4   int judge(int a,int b,int c,int n) 5   { 6    7    if(num[b][head[b]]==n)return false; 8    else 9    { 10    if(num[a][head[a]]==n) //若现在这个盘子在A柱子上面,那么就可以确定,现在我们的任务是将A上n-1个盘子移到B盘上面去,那么此时我们就可以把B盘当做C盘,因为第n个盘子合法了,我们可以不去管他了。。 11    { 12    if(n==1)return true; 13    head[a]++; 14    return judge(a,c,b,n-1); 15    } 16    else 17    if(num[c][head[c]]==n) 18    { 19    if(n==1)return true; 20    head[c]++; 21    return judge(b,a,c,n-1); 22    } 23    } 24   } 25   int main() 26   { 27    int t,n; 28    scanf("%d",&t); 29    while(t--) 30    { 31    scanf("%d",&n); 32    for(int i=0;i<3;i++) 33    { 34    scanf("%d",&num[i][0]); 35    for(int j=1;j<=num[i][0];j++) 36    { 37    scanf("%d",&num[i][j]); 38    } 39    } 40    int k; 41    head[0]=head[1]=head[2]=1; 42    if(judge(0,1,2,n))printf("true\n"); 43    else 44    printf("false\n"); 45    } 46   }

 

转载于:https://www.cnblogs.com/nuoyan2010/archive/2012/09/01/2667085.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)