자바 프로그래밍은 창고로 한노타 문제의 코드 실례를 구한다(비귀속)

2969 단어
[제목]
한노타 문제는 비교적 고전적이다. 여기서 게임 규칙을 수정한다. 현재 제한은 맨 왼쪽의 탑에서 맨 오른쪽으로 직접 이동할 수 없고 맨 오른쪽에서 맨 왼쪽으로 직접 이동할 수 없고 반드시 중간을 거쳐야 한다.탑이 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 + " ");
  }
}

총결산
이상은 본고가 자바 프로그래밍용 창고에서 한노타 문제를 풀기 위한 코드 실례(비귀속)에 관한 모든 내용입니다. 여러분께 도움이 되기를 바랍니다.관심 있는 친구는 자바 몬테카로 알고리즘 원주율 근사값 구하기 실례 상세, 자바 유전 알고리즘의 미궁 탈출, 자바 실현 네 가지 혼합 연산 코드 예시 등을 참고할 수 있습니다. 어떤 문제가 있으면 언제든지 메시지를 남길 수 있습니다. 여러분의 토론을 환영합니다.

좋은 웹페이지 즐겨찾기