[ CodeVS冲杯之路 ] P3145

   不充钱,你怎么AC?

       题目:http://codevs.cn/problem/3145/

 

       经典的汉诺塔问题

       我们移动的时候,如果是最小的1号就可以直接移动,否则先将上面的x-1号先移动到借用塔上,然后将x号移动到目标塔,最后将借用塔上的x-1号移动到目标塔,每次移动都需要借用一个借用塔,此塔为不同于出发塔和目标塔的那一个,递归做即可

       次数的话个人比较懒,直接输出2n-1,就不在移动的时候统计次数了

   

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<iostream>
 6 #include<algorithm>
 7 #define outp printf("%d from %c to %c\n",x,a,b)
 8 using namespace std;
 9 
10 void hanoi(int x,char a,char b,char c)
11 {
12     if (x==1)
13     {
14         outp;
15         return;
16     }
17     hanoi(x-1,a,c,b);
18     outp;
19     hanoi(x-1,c,b,a);
20 }
21 int main()
22 {
23     int n;
24     scanf("%d",&n);
25     printf("%d\n",(1<<n)-1);
26     hanoi(n,'A','C','B');
27     return 0;
28 }

 

  A完这道题,终于上黄金了,吃包辣条庆祝一下

 

posted @ 2016-09-10 20:24  Hadilo  阅读(171)  评论(0编辑  收藏  举报