자바 프로그래밍은 창고로 한노타 문제의 코드 실례를 구한다(비귀속)
한노타 문제는 비교적 고전적이다. 여기서 게임 규칙을 수정한다. 현재 제한은 맨 왼쪽의 탑에서 맨 오른쪽으로 직접 이동할 수 없고 맨 오른쪽에서 맨 왼쪽으로 직접 이동할 수 없고 반드시 중간을 거쳐야 한다.탑이 N층이 있을 때 가장 좋은 이동 과정과 가장 좋은 이동 총 걸음수를 인쇄하도록 한다.
[해답]
전편은 귀속적인 방법으로 이 문제를 해결했다. 여기서 우리는 창고로 한노타의 세 탑, 즉 귀속되지 않는 방법을 모의했다.
원리는 다음과 같다. 수정된 한노타 문제는 어떤 탑도 왼쪽에서 오른쪽으로 직접 이동할 수 없고, 오른쪽에서 왼쪽으로 직접 이동할 수도 없고, 중간을 지나야 한다. 즉, 실제로 할 수 있는 동작은 단지 네 가지뿐이다. 왼쪽->중, 중->좌, 중->우, 우->중
창고로 한노타의 이동을 모의하는 것은 사실 어떤 창고에서 창고 꼭대기 요소가 튀어나와 다른 창고에 눌러서 다른 창고의 꼭대기로서 이것을 이해하면 된다. 이 문제에 대해 두 가지 원칙이 있다.
1: 소압대원칙, 즉 압입할 원소값이 압입할 창고의 창고 꼭대기의 원소값보다 크면 안 된다는 것도 한노타의 기본 규칙이다
2: 인접불가역원칙, 즉 나의 이전 조작이 왼쪽->중이라면 다음 조작은 반드시 중간->왼쪽이 아니다. 그렇지 않으면 옮기고 다시 옮기는 셈이다
이 두 가지 원칙이 있으면 두 가지 매우 유용한 결론을 유도할 수 있다.
1. 게임의 첫 번째 동작은 반드시 L->M
2. 최소 걸음 수를 벗어나는 과정에서 어느 순간에도 네 동작 중 한 동작만 소압대와 인접불가역 원칙을 위반하지 않고 다른 세 동작은 반드시 위반한다
【코드 구현】
import java.util.Stack;
class Demo{
public enum Action{
No,LToM,MToL,MToR,RToM
}
//num ,left,mid,right
public static int hanoi(int num,String left,String mid,String right){
//lS,mS,rS ( )
Stack lS = new Stack();
Stack mS = new Stack();
Stack rS = new Stack();
lS.push(Integer.MAX_VALUE);
mS.push(Integer.MAX_VALUE);
rS.push(Integer.MAX_VALUE);
for(int i=num;i>0;i--){
lS.push(i);
}
Action[] record = { Action.No };
int step = 0;
while(rS.size() != num+1){
step += fStackToStack(record,Action.MToL,Action.LToM,lS,mS,left,mid);
step += fStackToStack(record,Action.LToM,Action.MToL,mS,lS,mid,left);
step += fStackToStack(record,Action.MToR,Action.RToM,rS,mS,right,mid);
step += fStackToStack(record,Action.RToM,Action.MToR,mS,rS,mid,right);
}
return step;
}
//preNoAct ,nowAct
public static int fStackToStack(Action[] record,Action preNoAct,Action nowAct,Stack fStack,Stack tStack,String from,String to){
if(record[0] != preNoAct && fStack.peek() < tStack.peek()){
tStack.push(fStack.pop());
System.out.println("Move " + tStack.peek() + " " + from + "->" + to);
record[0] = nowAct;
return 1;
}
return 0;
}
public static void main(String[] args){
int i = hanoi(3,"left","mid","right");
System.out.println(" " + i + " ");
}
}
총결산
이상은 본고가 자바 프로그래밍용 창고에서 한노타 문제를 풀기 위한 코드 실례(비귀속)에 관한 모든 내용입니다. 여러분께 도움이 되기를 바랍니다.관심 있는 친구는 자바 몬테카로 알고리즘 원주율 근사값 구하기 실례 상세, 자바 유전 알고리즘의 미궁 탈출, 자바 실현 네 가지 혼합 연산 코드 예시 등을 참고할 수 있습니다. 어떤 문제가 있으면 언제든지 메시지를 남길 수 있습니다. 여러분의 토론을 환영합니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.