shushus

Спринт 5. Стандартные алгоритмы - рекурсия. Задание 3. Блядские башни.

Dec 10th, 2022
226
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.66 KB | None | 0 0
  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. }
Advertisement
Add Comment
Please, Sign In to add comment