九连环的解法和代码
今天第一次解九连环,觉得这个小玩具还是很有思想的,特把解法整理如下。
首先要明确以下两个事实:
每个环只有两种状态:套在柄上(记作1),取下来(记作0)。很容易联想到二进制,为了表示的方便,我们把一个九连环的状态记作一串9位的二进制数,最低位对应最外侧的环。
当且仅当某环是最低位的环,或,它的右一位是1而右边其余位都是0,这两种情况下,该环的状态可以切换(取下或套上)。
(至于怎么操作……那是你的事情了)
解法是递归过程。定义解开
1
20 -> 1
00 -> 01 -> 11
1
2
3
4solve(n - 2);
flip(n - 1); // 翻转最高位
rsolve(n - 2);
solve(n - 1);
举个例子更好懂些: 1
11111 ---> 11000 -> 01000 ---> 01111 ---> 00000
代码在这里,可以输出解法和步骤。