zoukankan      html  css  js  c++  java
  • 汉诺塔:递归

    题目描述

    汉诺塔是一种古老的游戏。

    一共3个柱子,标号为1,2,3

    1号柱子有从大到小一共n个盘子。

    每次移动最上方的一个盘子,可以移动到其他的柱子。

    任何一个盘子,都不能叠在比它更小的盘子的上方。

    请把盘子从1号柱子,全部移动到3号柱子。

     

    起始:

     

    移动到这样:

     

    现在,给出了n个盘子,请你描述一下用最短次数移动的过程。

    输入

    一个数,n,表示盘子的数量(n<=10

    输出

    输出若干行。

    每次操作,输出一行。输出“Move x from x to x”的格式。

    最小盘子的编号为1,最大盘子的编号为n

    样例输入

    4

    样例输出

    Move 1 from 1 to 2
    Move 2 from 1 to 3
    Move 1 from 2 to 3
    Move 3 from 1 to 2
    Move 1 from 3 to 1
    Move 2 from 3 to 2
    Move 1 from 1 to 2
    Move 4 from 1 to 3
    Move 1 from 2 to 3
    Move 2 from 2 to 1
    Move 1 from 3 to 1
    Move 3 from 2 to 3
    Move 1 from 1 to 2
    Move 2 from 1 to 3
    Move 1 from 2 to 3

    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    using namespace std;
    void hanoi(int a,int b,int c,int n){					//代表 n个盘子从a到c,b为辅助柱 
    	if(n==1)
    	printf("Move %d from %d to %d
    ",n,a,c);			//只剩下一个盘子时,直接从a到c 
    	else{
    		hanoi(a,c,b,n-1);					//将n-1个盘子,从a移动到b,c为辅助柱 
    		printf("Move %d from %d to %d
    ",n,a,c);		//将第n个盘子从a移动到c 
    		hanoi(b,a,c,n-1);					//将n-1个盘子,从b移动到c,a为辅助柱 
    	}
    }
    int main(){
    	int n;
    	cin>>n;
    	hanoi(1,2,3,n);
    	return 0;
    }
    
  • 相关阅读:
    一个长串由一个字串循环构成
    区间边界 张贴海报的可见性
    summary
    分区本质 从磁盘物理层面优化查询 分区操作的锁表
    全局变量在反汇编中是怎么体现的
    MathType怎么打定积分竖线
    定积分换元法洛必达法则求极限
    静态链表的插入和删除
    Git恢复之前版本的两种方法reset、revert
    服务去耦合
  • 原文地址:https://www.cnblogs.com/52dxer/p/10565326.html
Copyright © 2011-2022 走看看