하노이 문제의 ybt1205 타워

하노이 문제의 ybt1205 타워

겨울도 계속 할 계획이다!

설명 [TITLE]

지적 장난감 유럽 매장에서 판매되는 19 세기는 약 64 개 개의 디스크로 구성되는 문자열 열의 승순 동판 세 바, 상단에서 하단으로 최 좌측 막대있다. 목적은 디스크, 테이프를 이동할 수 있으며, 상단에있는 작은 캡을 허용하지 않는 디스크의 모든 극의 중간에 왼쪽 줄입니다.

이것은 우리가 거의 모든 재료에이 문제가 잘 알려진 문제입니다. 그 시간은 시장에 디스크를 이동할 수 있습니다 상단 덩어리를 허용하지 않기 때문에, 모바일 판 (64)의 수는 다음과 같습니다 18,446,744,073,709,551,615

모든 마이크로 (출력 할 수 없습니다) 하나 개의 움직임을 계산하기 위해 가능하면이 천문학적 숫자이다, 다음도 거의 백만 년이 필요합니다. 우리는 단지 문제에 대한 해결책을 찾아 N의 값이 작을 때 하노이의 타워를 해결할 수 있습니다, 하노이 64 층의 타워를 해결하기 위해 컴퓨터를 사용하기가 어렵습니다.

소형 ~ 대형의 디스크가 있다고 가정 번호 1, 2, ...

[Enter]를

3 개의 단일 - 문자열은 정수 (20 명 미만)를 입력합니다.

번호판 정수, 마지막 세 문자는 세 개의 극 수를 나타냅니다.

[출력]

플레이트의 각 단계의 동작의 출력을 기록. 움직이는 라인.

각 이동 레코드, 예를 들면, A-> 3-> B 형태, 즉, 상기 플레이트 (3)의 수는 레버 막대 (B)로부터 이동된다.

[샘플 입력]

2 a b c

[샘플 출력]

a->1->c a->2->b c->1->b

[설명]

첫째, 즐거움의 첫 번째 물결, 나는 ybt 시험 20000- 위로 순위! (Caijizihai)

사실,이 질문은 지아 오빠 (시작 그녀의 블로그를 ) 내가 이해하지 않았을 때 말 나중에도 표준 프로세스 및 Taichetaiwu 없다 (물론, 더 매운 닭 하노이의 탑이있다).

규칙은 위에서 말한 게임을 시작하는 실제 전략을 시작, 문제 해결 방안을 다음에있다 :

우리가 모든 디스크가 제거하고자하기 때문에, 제 기둥에 다른 이동 한 후 목표 최대 디스크 트레이로 이동하고 최종적으로 판 운동의 나머지 이동 위에 큰 디스크 것 가장 큰 판을 완료했다.

우리는 세 부분으로 원래의 문제를 분해 할 수 있도록, 유 Panzi 첨탑라고 가장 큰 플레이트가 될 섀시.

아래 사항 : 전체 네트워크 방법을 소개하는 가장 인기있는 형제의 파괴가 세계의 하노이 타워 파괴를 사용합니다 :

세계를 파괴하는 세 가지 단계가 있습니다

1 단계 : 테이크 첨탑

2 단계 : 모바일 섀시

3 단계는 : 첨탑 다시 넣어

어떻게하지 매우 간단하고 작은 파트너 것은 그것을 파괴하려고 집에 서둘러합니다!

그러나 20 <그래서 상기 한 그러나 심지어 컴퓨터 (펜티엄 학교 실 기준 압력)과, 둘째 단에만 해당하는 경우를 설명하므로 여기서, 디스크 (30) (출력하지 않는다)을 이동시키는 움직임을 계산하도록

I는 전술 한 바와 같이, 거기에 해당하는 경우, 디스크는, 그 문제는 다음의 경우에 N-1 디스크 위로 제 n 디스크 이동 거리 N-1 디스크가 한 것이다. 재귀 국경은 테이크의 경우, 대상 극에 디스크로 직접 이동하려면 원하는만큼이 시간입니다. 그래서 당신은 재귀 함수를 쓸 수 :

void hanoi(int n,char A,char B,char C)//这里的A为起始杆,B为目标杆,C为终点杆
{
    if (n==1)
    {
        printf("%c->%d->%c\n",A,n,B);//直接拿过去,不跟他多bibi
        return;//递归边界
    }
    hanoi(n-1,A,C,B);//将n-1个盘子从A移到C(给大佬(本次最大圆盘)让道加让座)
    printf("%c->%d->%c\n",A,n,B);//本次操作的核心:将本次最大圆盘直接移至目标杆
    hanoi(n-1,C,B,A);//将n-1个盘子从C移回到B(移动完的最大圆盘所在地)
    return;
}

다음에직접적인 사본전체 코드 :

#include <iostream>
#include <cstdio>
using namespace std;
void hanoi(int n,char A,char B,char C)
{
    if (n==1)
    {
        printf("%c->%d->%c\n",A,n,B);
        return;
    }
    hanoi(n-1,A,C,B);
    printf("%c->%d->%c\n",A,n,B);
    hanoi(n-1,C,B,A);
    return;
}
int main()
{
    char A,B,C;
    int n;
    cin>>n>>A>>B>>C;
    hanoi(n,A,B,C);
    return 0;
}

니스,하지만 물 A가 블로그 게시물

추천

출처www.cnblogs.com/Wild-Donkey/p/12229834.html