1. 程式人生 > >檔案操作版漢諾塔類問題

檔案操作版漢諾塔類問題

題目描述:

有A、B、C三個盤子用來盛餅,餅的個頭有大有小,沒有大小完全相同的,餅在盤子中必須大個的在下面,小個的放在上面。現在 A 盤中放著 n 張薄餅(n由檔案input02.txt讀入),需要藉助 B 盤放在 C 盤中,請寫出程式程式碼實現,並在程式中註釋說明原理,最後結果請輸出在output02.txt中。 

特別注意:請在你使用的計算機 D: 盤建立一個以你學號為名的資料夾,將考試提供的“程式設計輸入檔案”資料夾中的檔案都拷貝至該資料夾備用。最後提交時,將你的學號資料夾中的所有內容打包為一個以你學號命名的壓縮檔案(.rar)格式,然後提交該檔案。所有程式程式碼均需用註釋說明求解原理或思路。

解題思路:這個題說白了就是漢諾塔類問題,我覺得難點就在於直接在自定義函式中把結果輸出到txt檔案裡面,要在函式中引用檔案流物件。

我的程式碼:

#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);
    }
}