하노이 문제의 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;
}