| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 467 人关注过本帖
标题:关于汉诺塔进阶衍生问题!
只看楼主 加入收藏
空沃夫
Rank: 2
来 自:老和山职业技术学院
等 级:论坛游民
帖 子:48
专家分:76
注 册:2012-12-7
结帖率:83.33%
收藏
已结贴  问题点数:10 回复次数:9 
关于汉诺塔进阶衍生问题!
原来的汉诺塔问题,相信各位大侠都熟知不已,这里就不赘述了。
小弟最近遇到的是一个进阶型的,就是把整个搬运的步骤图案给打印出来。,以3块为案例,开始效果图如图:
step1:
  -|-       |        |        \*默认每块砖是不同大小的,大在下,小在上,其中中间那根东西是针。。。*\
 --|--      |        |
---|---     |        |
step2:
   |        |        |
 --|--      |        |
---|---    -|-       |
step3:
   |        |        |
   |        |        |
---|---    -|-     --|--
......
\*就是这样打印,的图案。*\
顺便引用下汉诺塔问题的代码(原来那玩意,就是从哪个移到哪个,简单的步骤。)。
程序代码:
#include <stdio.h>

int main (void)
{
    int n;
    void hanoi(int n,char a,char b, char c);
     scanf("%d",&n);
    hanoi(n,'a','b','c');
    return 0;
   

}
    void hanoi(int n,char a,char b, char c)
{
   

    if(n==1){
    printf("%c-->%c\n",a,b);
    }
    else {
        hanoi(n-1,a,c,b);
        printf("%c-->%c\n",a,b);
        hanoi(n-1,c,b,a);
    }
}

搜索更多相关主题的帖子: 效果图 搬运 
2012-12-07 16:05
空沃夫
Rank: 2
来 自:老和山职业技术学院
等 级:论坛游民
帖 子:48
专家分:76
注 册:2012-12-7
收藏
得分:0 
晕,补充下,楼上刚刚开始没打好,应该是这样,上面都歪了。
step1:
  -|-       |        |        \*默认每块砖是不同大小的,大在下,小在上,其中中间那根东西是针。。。*\
 --|--      |        |
---|---     |        |
step2:
   |        |        |
 --|--      |        |
---|---    -|-       |
step3:
   |        |        |
   |        |        |
---|---    -|-     --|--
2012-12-07 16:07
空沃夫
Rank: 2
来 自:老和山职业技术学院
等 级:论坛游民
帖 子:48
专家分:76
注 册:2012-12-7
收藏
得分:0 
我晕。,怎么发出来的时候就变歪了。。。。,算了,大家理解下。就是step1跟step2的第二行。
2012-12-07 16:09
空沃夫
Rank: 2
来 自:老和山职业技术学院
等 级:论坛游民
帖 子:48
专家分:76
注 册:2012-12-7
收藏
得分:0 
表示本人正在努力的编写中,我现在的一个想法是能不能以数组的形式储存“-”跟“|”?然后再进行“移动”。
不知道各位大神有无指教?
2012-12-07 17:23
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:2 
我的思路是定义一个结构体存储当前汉诺塔

把两个printf改成struct_Change(char a, char b)
根据传参改变当前汉诺塔

再用循环输出


[fly]存在即是合理[/fly]
2012-12-07 18:42
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:8 
有趣的想法,一时兴起凑个热闹。

程序代码:
#include<stdio.h>
#define MAX_PLATES    16
typedef struct
{
    int column[3][MAX_PLATES];
    int height[3];
    int plates;
}Hanoi;
void show_hanoi(Hanoi h)
{
    int space, i, j, k;
    space = h.plates * 2 + 1;
    for(i = h.plates - 1; i >= 0; i--, puts(""))
    for(j = 0; j < 3; j++)
    for(k = 0; k < space; k++)
        if(k < h.plates - h.column[j][i]) putchar(' ');
        else if(k < h.plates) putchar('_');
        else if(k == h.plates) putchar('|');
        else if(k <= h.plates + h.column[j][i]) putchar('_');
        else putchar(' ');
}
void move_hanoi(Hanoi *h, int from, int to, int by, int d)
{
    static step;
    int t;
    if(d == h->plates) step = 1;
    if(d == 0) return;
    move_hanoi(h, from, by, to, d - 1);
    h->column[to][h->height[to]++] = h->column[from][--h->height[from]];
    h->column[from][h->height[from]] = 0;
    printf("\nstep %d:\n", step++);
    show_hanoi(*h);
    move_hanoi(h, by, to, from, d - 1);
}
void start_hanoi(int n)
{
    Hanoi h;
    int i;
    if(n < 1 || n > MAX_PLATES) return;
    h.plates = n;
    h.height[0] = n;
    h.height[1] = 0;
    h.height[2] = 0;
    for(i = 0; i < n; i++)
    {
        h.column[0][i] = n - i;
        h.column[1][i] = 0;
        h.column[2][i] = 0;
    }
    printf("start:\n");
    show_hanoi(h);
    move_hanoi(&h, 0, 2, 1, n);
}
int main()
{
    int n;
    printf("input plates number in hanoi you want [1 - %d]:", MAX_PLATES);
    scanf("%d", &n);
    start_hanoi(n);
    return 0;
}



[ 本帖最后由 beyondyf 于 2012-12-7 20:33 编辑 ]

重剑无锋,大巧不工
2012-12-07 20:31
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
我终于找到和杨兄弟相似的地方了

我也是习惯把主函数放在最后

DO IT YOURSELF !
2012-12-07 20:39
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
个人习惯,只有少量函数而且都不大时就懒得写声明了。

当然,代码风格一定要与项目相适应,在团队开发的大规模项目中是一定不能这么写的。

重剑无锋,大巧不工
2012-12-07 21:17
空沃夫
Rank: 2
来 自:老和山职业技术学院
等 级:论坛游民
帖 子:48
专家分:76
注 册:2012-12-7
收藏
得分:0 
回复 8楼 beyondyf
厉害!
2012-12-08 22:25
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
呵呵,也许你自己先写一个然后再对比看我的代码收获会更大。

有兴趣的话我还可以写一个非递归的例子,当然,要看大家的兴致有多高了。

重剑无锋,大巧不工
2012-12-08 22:44
快速回复:关于汉诺塔进阶衍生问题!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014475 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved