文件操作版汉诺塔类问题

2019-11-08 16:15:07 浏览数 (1)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://blog.csdn.net/weixin_42449444/article/details/84726437

题目描述:

有A、B、C三个盘子用来盛饼,饼的个头有大有小,没有大小完全相同的,饼在盘子中必须大个的在下面,小个的放在上面。现在 A 盘中放着 n 张薄饼(n由文件input02.txt读入),需要借助 B 盘放在 C 盘中,请写出程序代码实现,并在程序中注释说明原理,最后结果请输出在output02.txt中。

特别注意:请在你使用的计算机 D: 盘建立一个以你学号为名的文件夹,将考试提供的“程序设计输入文件”文件夹中的文件都拷贝至该文件夹备用。最后提交时,将你的学号文件夹中的所有内容打包为一个以你学号命名的压缩文件(.rar)格式,然后提交该文件。所有程序代码均需用注释说明求解原理或思路。

解题思路:这个题说白了就是汉诺塔类问题,我觉得难点就在于直接在自定义函数中把结果输出到txt文件里面,要在函数中引用文件流对象。

我的代码:

代码语言:javascript复制
#include <bits/stdc  .h>
using namespace std;
//看完题目之后,可以知道这是一个汉诺塔类问题
int Count = 0;   //用来记录移动薄饼的总次数
void move(fstream &myfile,char getone,char putone);
void hanoit(fstream &myfile,int n,char a,char b,char c);

int main()
{
    ifstream txtfile;      //建立输入文件流对象
    txtfile.open("d:\代码\20171101231\input02.txt");
    fstream myfile;       //建立文件流
    myfile.open("d:\代码\20171101231\output02.txt",ios::out|ios::trunc);
    //打开目标文件,ios::out表示写入文件操作,ios::trunc当文件存在时,清空文件内容
    int n;
    while(!txtfile.eof())    //eof()用来侦测是否读到文件尾,读到文件尾返回true
    {
        txtfile >> n;   //n张薄饼
    }
    hanoit(myfile,n,'A','B','C');
    myfile << "一共移动了" << Count << "次薄饼。" << endl;
    txtfile.close();  //拉完shi要记得擦PP
    myfile.close();  
    return 0;
}

void move(fstream &myfile,char getone,char putone)
{
    Count  ;
    myfile << getone << "-->" << putone << endl;   //输出是从哪一个盘移动到了哪一个盘
}

void hanoit(fstream &myfile,int n,char a,char b,char c)
{
    if(n == 1)   //若只有一张薄饼,直接从A盘移动到C盘
    {
        move(myfile,a,c);
    }
    else
    {
        hanoit(myfile,n-1,a,c,b);
        move(myfile,a,c);
        hanoit(myfile,n-1,b,a,c);
    }
}

0 人点赞