Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2019
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.24 KB | None | 0 0
  1. /***
  2. Tower of Hanoi solver.
  3.  
  4. Example :
  5.  
  6. ```
  7. $ rustc hanoi.rs
  8. $ ./hanoi 3
  9. ║─ ║ ║ ║
  10. ║── ║ ║ ║
  11. ║───║ ║ ║
  12.  
  13. ║ ║ ║ ║
  14. ║── ║ ║ ║
  15. ║───║ ║─ ║
  16.  
  17. ║ ║ ║ ║
  18. ║ ║ ║ ║
  19. ║───║── ║─ ║
  20.  
  21. ║ ║ ║ ║
  22. ║ ║─ ║ ║
  23. ║───║── ║ ║
  24.  
  25. ║ ║ ║ ║
  26. ║ ║─ ║ ║
  27. ║ ║── ║───║
  28.  
  29. ║ ║ ║ ║
  30. ║ ║ ║ ║
  31. ║─ ║── ║───║
  32.  
  33. ║ ║ ║ ║
  34. ║ ║ ║── ║
  35. ║─ ║ ║───║
  36.  
  37. ║ ║ ║─ ║
  38. ║ ║ ║── ║
  39. ║ ║ ║───║
  40. ```
  41.  
  42. ***/
  43.  
  44. use std::fmt::{Display, Formatter};
  45.  
  46. #[derive(Debug)]
  47. struct Hanoi {
  48. disks: [Vec<u32>; 3],
  49. size: u32
  50. }
  51.  
  52. impl Hanoi {
  53. pub fn new(num_disks: u32) -> Self {
  54. Hanoi {
  55. size: num_disks,
  56. disks: [
  57. (1..=num_disks).rev().collect(),
  58. vec![],
  59. vec![]
  60. ]
  61. }
  62. }
  63.  
  64. fn move_disk(&mut self, from: usize, to: usize){
  65. let d = self.disks[from].pop().unwrap();
  66. self.disks[to].push(d);
  67. println!("{}", self);
  68. }
  69.  
  70. fn solve_at(&mut self, n: u32, from: usize, middle: usize, to: usize){
  71. if n>0 {
  72. self.solve_at(n-1, from, to, middle);
  73. self.move_disk(from, to);
  74. self.solve_at(n-1, middle, from, to);
  75. }
  76. }
  77.  
  78. pub fn solve(&mut self) {
  79. println!("{}", self);
  80. self.solve_at(self.size, 0, 1, 2);
  81. }
  82. }
  83.  
  84. impl Display for Hanoi {
  85. fn fmt(&self, f: &mut Formatter) -> std::fmt::Result {
  86. let s = self.size as usize;
  87. for i in (0..s).rev() {
  88. for j in 0..(3*s) {
  89. if j%s==0 {write!(f, "║")?;}
  90. write!(f, "{}",
  91. match self.disks[j/s].get(i) {
  92. Some(&n) if (n as usize)>(j%s) => '─',
  93. _ => ' '
  94. }
  95. )?;
  96. }
  97. write!(f, "║\n")?;
  98. }
  99. Ok(())
  100. }
  101. }
  102.  
  103. fn main(){
  104. let n = std::env::args().nth(1).and_then(|s| s.parse().ok()).unwrap_or(4);
  105. Hanoi::new(n).solve();
  106. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement