汉诺塔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 };