View difference between Paste ID: WGU806R9 and nitHVh1C
SHOW: | | - or go back to the newest paste.
1
#include <iostream>
2
#include <stdexcept>
3
#include <vector>
4
5
using namespace std;
6
7
class Tower {
8
public:
9
    
10
    Tower(int disks_num) {
11
        FillTower(disks_num);
12
    }
13
    int GetDisksNum() const {
14
        return disks_.size();
15
    }
16
    void SetDisks(int disks_num) {
17
        FillTower(disks_num);
18
    }
19
20
    void AddToTop(int disk) {
21
        int top_disk_num = disks_.size() - 1;
22
        if (0 != disks_.size() && disk >= disks_[top_disk_num]) {
23
            throw invalid_argument("Unable to put a big disk on a small one");
24
        } else {
25
            disks_.push_back(disk);
26
        }
27
    }
28
    
29
    void TopTransfer(Tower& destination){
30
        auto Top = disks_[disks_.size() - 1]; 
31
        disks_.erase(end(disks_) - 1); 
32
        destination.AddToTop(Top);
33
    }
34
35
    void MoveDisks(int disks_num, Tower& destination, Tower& buffer) {
36
        if (disks_num<=0) {           
37
            return;
38
        }else{
39
            MoveDisks(disks_num - 1, buffer, destination);
40
            TopTransfer(destination);
41
            buffer.MoveDisks(disks_num - 1, destination, *this);
42
        }
43
 }
44
private:
45
    vector<int> disks_;
46
47
    void FillTower(int disks_num) {
48
        for (int i = disks_num; i > 0; i--) {
49
            disks_.push_back(i);
50
        }
51
    }
52
};
53
54
void SolveHanoi(vector<Tower>& towers) {
55
    int disks_num = towers[0].GetDisksNum();
56
    towers[0].MoveDisks(disks_num, towers[2], towers[1]);
57
}
58
59
int main() {
60
    int towers_num = 3;
61
    int disks_num = 3;
62
    vector<Tower> towers;
63
    for (int i = 0; i < towers_num; ++i) {
64
        towers.push_back(0);
65
    }
66
    towers[0].SetDisks(disks_num);
67
    SolveHanoi(towers);
68
}