九连环解法秘籍:
先说一下原理:要想解下第9环则必须把第8环前面所有的环清掉,
同理,要想解下第7环则必须把第6环前面所有的环清掉,要想解下第5
环则必须把第4环前面所有的环清掉,要想解下第3环则必须把第2环前
面所有的环清掉。所以第一步就是把第一个环从夹缝中取下。然后一步
一步重复步骤一、二就可以取下所有的环了。无论是上环还是下环都要
从夹缝中操作,从夹缝外直接套上是不行的。
现在开始解环:
步骤一:更改第一个环和第二个环的状态,(1,在上;0,在下)
第一状态:01*******
第二状态:00*******
仅在此两个状态之间改变,如果是第一状态则改为第二状态;如果是
第二状态则改为第一状态。
步骤二:找到在上面的最小的那个环,更改其下一个环的位置。下一个
环在上则取下,在下则装上。例如
000111111 => 000101111
010001011 => 011001011
反复重复步骤一、二,即可解掉所有的环。
上环步骤一样,依然是重复上面两个步骤。
附上自己的小程序:NineCircle.java
public class NineCircle {
final int UP=1,DOWN=0;
int circle[]={DOWN,UP,UP,UP,UP,UP,UP,UP,UP};
int step;
public boolean isAllDown(){
for(int i=0;i<9;i++){
if(circle[i]==UP){
return false;
}
}
return true;
}
public void setAllDown(){
step=0;
for(int i=0;i<9;i++){
circle[i]=DOWN;
}
printCircle();
}
public void setAllUP(){
step=0;
for(int i=0;i<9;i++){
circle[i]=UP;
}
// circle[0]=DOWN;
printCircle();
}
public boolean isAllUp(){
for(int i=1;i<9;i++){
if(circle[i]==DOWN){
return false;
}
}
return true;
}
public void untie(){
setAllUP();
System.out.println("Begin to untie it!");
while(!isAllDown()){
first();
if(!isAllDown()){
second();
}
}
System.out.println("Well Done!");
}
public void tie(){
setAllDown();
System.out.println("Begin to tie it!");
while(!isAllUp()){
first();
if(!isAllUp()){
second();
}
}
System.out.println("Well Done!");
}
public void first(){
if(circle[0]==DOWN && circle[1]==UP){
circle[1]=DOWN;
printCircle();
}else if(circle[0]==DOWN && circle[1]==DOWN){
circle[1]=UP;
printCircle();
}else{
circle[0]=DOWN;
circle[1]=UP;
printCircle();
}
}
public void second(){
if(circle[minUP()+1]==UP){
circle[minUP()+1]=DOWN;
printCircle();
}else{
circle[minUP()+1]=UP;
printCircle();
}
}
public int minUP(){
for(int i=1;i<9;i++){
if (circle[i]==UP){
return i;
}
}
return 10;
}
public void printCircle(){
String s="";
for(int i=0;i<9;i++){
s+=String.valueOf(circle[i]);
}
System.out.println(step+":"+s);
step++;
}
public NineCircle() {
}
public static void main(String[] args) {
NineCircle nc=new NineCircle();
nc.untie();
nc.tie();
}
}