Frogs cross the river is a very interesting intellectual game, the main idea is as follows: A river between a number of stone spacing, two teams of frogs across the river, each team has 3 frogs, these frogs can only move forward, can not move backwards, and only one frog at a time to move forward. During the move, the frog can move in front of the empty space, not to skip two positions at a time, but can skip the other side a frog into the front of a vacancy. Ask the two teams how to move the frog to use the fewest steps to the opposite shore separately? (→→→-←←←) Maybe 3 frogs are too few, and it's not hard to do it mentally. What if there were 100 frogs?
/*** Frogs cross the river *@authorRubekid **/ Public classRiverfrog { Public Static Final intLeft_frog =-1; Public Static Final intRight_frog = 1; Public Static Final intSTONE = 0; Private int[] frogs; Private intZeroindex; Private intlength; Private intStep = 0; PublicRiverfrog (intNumber ) {Frogs=New int[Number * 2 +1]; Length=frogs.length; Zeroindex= LENGTH/2; for(inti=0; i< number; i++) {Frogs[i]=Left_frog; } Frogs[zeroindex]=STONE; for(inti=0; i< number; i++) {frogs[i+ Zeroindex + 1] =Right_frog; } } Public voidrun () { while(!ismoveend (Left_frog) | |!ismoveend (Right_frog)) { intleft = ZeroIndex-1; intright = Zeroindex+1; if(Left>-1 && Right <length) { if(Frogs[left]! =Frogs[right]) { if(Frogs[left] = =Left_frog) { if(Left > 0 && frogs[left-1] = = Right_frog) {//If you move right, there are two in the middle This. Move (right); } Else{ This. Move (left); } } Else if(Left > 0 && frogs[left-1]==Left_frog) { This. Move (left-1); } Else if(Right <= length && frogs[right+1] = =Right_frog) { This. Move (right+1); } } Else{ if(Frogs[left] = =Right_frog) { if(Left > 0 && frogs[left-1] = =Left_frog) { This. Move (left-1); } Else if(right+1 < length && frogs[right+1] = =Right_frog) { This. Move (right+1); } Else if(Frogs[right] = =Right_frog) { This. Move (right); } } Else if(Frogs[right] = =Left_frog) { if(right+1 < length && frogs[right+1] = =Right_frog) { This. Move (right + 1); } Else if(left >0 && frogs[left-1] = =Left_frog) { This. Move (left-1); } Else if(Frogs[left] = =Left_frog) { This. Move (left); } } } } Else if(left = =-1){ if(Frogs[right] = = Left_frog && right<length-1){ This. Move (right+1); } Else{ This. Move (right); } } Else if(right = =length) { if(Frogs[left] = = Right_frog && Left > 0){ This. Move (left-1); } Else{ This. Move (left); }}} System.out.println ("Step:" +step); } Private voidMoveinti) { inttemp =Frogs[i]; Frogs[i]=Frogs[zeroindex]; Frogs[zeroindex]=temp; Zeroindex=i; Step++; Print (); } Private BooleanIsmoveend (intvalue) { inti=0;intmax=Zeroindex; if(Value = =Left_frog) {i= Zeroindex+1; Max=length; } for(intJ=i; j<max; J + +){ if(frogs[j]!=value) { return false; } } return true; } Private voidprint () {StringBuffer StringBuffer=NewStringBuffer (); for(intfrog:frogs) { if(frog>-1) {stringbuffer.append ("" +frog + ""); } Else{stringbuffer.append (Frog+ " "); }} System.out.println (Stringbuffer.tostring ()); }}
Fun algorithm-Frog across the river (JAVA)