汉诺塔I

题目链接:https://www.nowcoder.com/questionTerminal/7d6cab7d435048c4b05251bf44e9f185

题目大意:

  略

分析:

  利用汉诺塔与二进制的关系来做。

  如何用二进制解汉诺塔:https://www.bilibili.com/video/av7398130/

代码如下:

 1 class Hanoi {
 2 public:
 3     // 计算x的二进制位数 
 4     inline int getBits(int x) {
 5         int cnt = 1;
 6         while(x >>= 1) ++cnt;
 7         return cnt;
 8     } 
 9     
10     vector<string> getSolution(int n) {
11         vector< string > ans;
12         string s[3] = {"left", "mid", "right"};
13         vector< int > arr;
14         arr.resize(n, 0);
15         // tot表示总移动次数
16         int tot = (1 << n) - 1;
17         int cnt = 0;
18         while(cnt++ < tot) {
19             int lowbit = cnt & (-cnt);
20             int bitlen = getBits(lowbit) - 1;
21             int b = 1 + (n - bitlen) % 2;// 偏移,b = 1往右,b = 2往左
22             ans.push_back("move from " + s[arr[bitlen]] + " to " + s[(arr[bitlen] + b) % 3]);
23             arr[bitlen] = (arr[bitlen] + b) % 3;
24         }
25         return ans;
26     }
27 };
View Code

相关文章: