Top 35 C 언어 하노이 탑 29509 Votes This Answer

You are looking for information, articles, knowledge about the topic nail salons open on sunday near me c 언어 하노이 탑 on Google, you do not find the information you need! Here are the best content compiled and compiled by the https://toplist.aseanseafoodexpo.com team, along with other related topics such as: c 언어 하노이 탑 하노이탑 재귀호출, 하노이탑 파이썬, 하노이탑 알고리즘, 하노이 탑 재귀 증명, 하노이탑 문제, 하노이 탑 원판 4개, 백준 하노이탑, 하노이탑 점화식


[C언어] 재귀함수 팩토리얼, 하노이탑
[C언어] 재귀함수 팩토리얼, 하노이탑


[자료구조] C언어로 하노이 탑 만들기

  • Article author: claris.tistory.com
  • Reviews from users: 30903 ⭐ Ratings
  • Top rated: 4.1 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about [자료구조] C언어로 하노이 탑 만들기 Updating …
  • Most searched keywords: Whether you are looking for [자료구조] C언어로 하노이 탑 만들기 Updating 하노이 탑(The Tower of Hanoi)은 3개의 막대 중에서 막대 하나에 쌓여 있는 n개의 원판을 다른쪽 막대로 옮기는 게임이다. 단, 아래의 규칙을 지켜야 한다. 1. 한번에 하나의 원판만 이동한다. 2. 맨 위에 있는..Programming/Hobby
    DailyLife/Devlog
  • Table of Contents:
[자료구조] C언어로 하노이 탑 만들기

티스토리툴바

[자료구조] C언어로 하노이 탑 만들기
[자료구조] C언어로 하노이 탑 만들기

Read More

[c언어] 하노이탑 문제 (문제 설명, 예제)

  • Article author: dinae.tistory.com
  • Reviews from users: 39351 ⭐ Ratings
  • Top rated: 4.7 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about [c언어] 하노이탑 문제 (문제 설명, 예제) Updating …
  • Most searched keywords: Whether you are looking for [c언어] 하노이탑 문제 (문제 설명, 예제) Updating 하노이의 탑 하노이의 탑은 고대 인도로부터 시작한 일종의 퍼즐입니다. 목표는 아래의 조건을 지키며 한 축에 있는 원반들을 모두 다른 축으로 옮기는 것입니다. 조건 한번의 하나의 원판을 이동할 수 있다. 맨..
  • Table of Contents:

하노이의 탑

예제

태그

관련글

댓글0

공지사항

최근글

인기글

최근댓글

태그

전체 방문자

티스토리툴바

[c언어] 하노이탑 문제 (문제 설명, 예제)
[c언어] 하노이탑 문제 (문제 설명, 예제)

Read More

[C언어] 하노이탑 :: 태라에몽

  • Article author: kimtaeyoon-is-ironman.tistory.com
  • Reviews from users: 19970 ⭐ Ratings
  • Top rated: 3.2 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about [C언어] 하노이탑 :: 태라에몽 [C언어] 하노이탑 … 영화에서 유인원의 지능을 시험할 때 가끔 등장하는 기구.. 바로 하노이 탑입니다. … 규칙은 단순합니다. – 한 번에 하나의 원판만 … …
  • Most searched keywords: Whether you are looking for [C언어] 하노이탑 :: 태라에몽 [C언어] 하노이탑 … 영화에서 유인원의 지능을 시험할 때 가끔 등장하는 기구.. 바로 하노이 탑입니다. … 규칙은 단순합니다. – 한 번에 하나의 원판만 … 영화에서 유인원의 지능을 시험할 때 가끔 등장하는 기구.. 바로 하노이 탑입니다. (코딩하다보면 침팬치가 더 똑똑하다 생각이 들 수 있습니다) 규칙은 단순합니다. – 한 번에 하나의 원판만 옮길 수 있다. – 큰..무야~호
  • Table of Contents:
[C언어] 하노이탑 :: 태라에몽
[C언어] 하노이탑 :: 태라에몽

Read More

백준알고리즘_11729_재귀함수_하노이탑 이동 (C언어)

  • Article author: codevang.tistory.com
  • Reviews from users: 951 ⭐ Ratings
  • Top rated: 4.2 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 백준알고리즘_11729_재귀함수_하노이탑 이동 (C언어) Updating …
  • Most searched keywords: Whether you are looking for 백준알고리즘_11729_재귀함수_하노이탑 이동 (C언어) Updating 처음 풀어본 알고리즘 문제인데 이틀이 꼬박 걸렸습니다. 그런데 모범답안보니 너무 간단하네요. ㅠ 하노이탑 이동 원리를 아는 것 자체는 사실 무의미하지만 이 문제를 푸는 사고 과정 자체가 확립 되는 것이 중..
  • Table of Contents:

태그

‘▸알고리즘 문제 풀이’ 관련글

티스토리툴바

백준알고리즘_11729_재귀함수_하노이탑 이동 (C언어)
백준알고리즘_11729_재귀함수_하노이탑 이동 (C언어)

Read More

[C언어] 하노이의 탑 — Steemit

  • Article author: steemit.com
  • Reviews from users: 25819 ⭐ Ratings
  • Top rated: 4.8 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about [C언어] 하노이의 탑 — Steemit Updating …
  • Most searched keywords: Whether you are looking for [C언어] 하노이의 탑 — Steemit Updating [C언어] 하노이의 탑 오늘도 C코딩 하나를 소개 합니다. 꽤 유명하고 코딩을 배웠던 분들이라면 한번쯤 해보셨을 거에요. 학교에서 C언어를 배운 분들이면 과제로 잘 내주는 주제이기도 해서 코딩으 다들… by codingman
  • Table of Contents:

1 하노이의 탑

2 하노이의 탑 알고리즘(유명한 알고리즘)

3 실행

마무리

[C언어] 하노이의 탑 — Steemit
[C언어] 하노이의 탑 — Steemit

Read More

하노이탑 c언어 예제 (자료구조)

  • Article author: fishersheep.tistory.com
  • Reviews from users: 21563 ⭐ Ratings
  • Top rated: 3.3 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about 하노이탑 c언어 예제 (자료구조) 하노이탑 c언어 예제 (자료구조) … char to) { if (num == 1) printf(“원반1을 %c에서 %c로 이동\n”, from, to); else { Hanoi(num – 1, from, to, … …
  • Most searched keywords: Whether you are looking for 하노이탑 c언어 예제 (자료구조) 하노이탑 c언어 예제 (자료구조) … char to) { if (num == 1) printf(“원반1을 %c에서 %c로 이동\n”, from, to); else { Hanoi(num – 1, from, to, … 하노이탑 코드 비록 짧은 코드이지만 재귀함수를 이해하는데 도움이 많이 되는 것 같습니다. 저는 처음봤을때 머리로 한번에 이해가 되지않아서 한단계씩실행하여 과정을 천천히 이해했습니다. #define _CRT_SECUR..코딩공부
  • Table of Contents:
See also  Top 32 목 삐 었을 때 Best 115 Answer

하노이탑 c언어 예제 (자료구조)

티스토리툴바

하노이탑 c언어 예제 (자료구조)
하노이탑 c언어 예제 (자료구조)

Read More

[C언어 / 백준 – 1914번] 하노이 탑 (재귀)

  • Article author: wonsjung.tistory.com
  • Reviews from users: 16268 ⭐ Ratings
  • Top rated: 3.7 ⭐
  • Lowest rated: 1 ⭐
  • Summary of article content: Articles about [C언어 / 백준 – 1914번] 하노이 탑 (재귀) [C언어 / 백준 – 1914번] 하노이 탑 (재귀). 원1 2021. … 한 번에 한 개의 원판만을 다른 탑으로 옮길 수 있다. … 하노이의 탑 관련 문제해결은. …
  • Most searched keywords: Whether you are looking for [C언어 / 백준 – 1914번] 하노이 탑 (재귀) [C언어 / 백준 – 1914번] 하노이 탑 (재귀). 원1 2021. … 한 번에 한 개의 원판만을 다른 탑으로 옮길 수 있다. … 하노이의 탑 관련 문제해결은. www.acmicpc.net/problem/1914 1914번: 하노이 탑 세 개의 장대가 있고 첫 번째 장대에는 반경이 서로 다른 n개의 원판이 쌓여 있다. 각 원판은 반경이 큰 순서대로 쌓여있다. 이제 수도승들이 다음 규칙에 따라..
  • Table of Contents:
[C언어 백준 – 1914번] 하노이 탑 (재귀)

문제

입력

출력

[C언어 / 백준 - 1914번] 하노이 탑 (재귀)
[C언어 / 백준 – 1914번] 하노이 탑 (재귀)

Read More


See more articles in the same category here: Toplist.aseanseafoodexpo.com/blog.

[자료구조] C언어로 하노이 탑 만들기

하노이 탑(The Tower of Hanoi)은

3개의 막대 중에서 막대 하나에 쌓여 있는 n개의 원판을 다른쪽 막대로 옮기는 게임이다.

단, 아래의 규칙을 지켜야 한다.

1. 한번에 하나의 원판만 이동한다.

2. 맨 위에 있는 원판만 이동한다.

3. 크기가 작은 원판위에 큰 원판을 쌓을 수 없다.

n개의 원판을 옮기기 위해서는 먼저 임시 막대에 n-1개의 원판을 옮긴 후

처음 막대에 남아있는 맨 밑 원판을 목적지 막대에 옮기는 것을 반복한다.

그러고나면 원래 원판이 쌓여있던 막대는 빈 막대가 되고 임시 막대에는 n-1개의 원판이,

목적지 막대에는 가장 큰 원판이 하나 놓여있게 된다.

임시 막대에 있는 원판의 개수를 n으로 다시 설정하고 n-1개의 원판을 원래 원판이 있었던 첫막대에

옮긴다. 임시 막대에 남아있는 원판 하나를 목적지 막대에 옮긴다.

임시막대를 번갈아가면서 계속 반복하면

.

.

.

결국 임시 막대에는 제일 작은 원판 하나가 남게 되고, 이 원판을 옮기면

목적지 막대에 원판이 모두 쌓이게 된다.

와! 그러면 엄청 쉬운거 아닌가요?

프로그래밍을 처음 접하는 사람이면 하노이 탑이 첫 난관일 수도 있다.

하나하나 짚어가면서 생각해보면 쉬우니까 포기하지 말고 열심히 해보자.

n개의 원판을 옮기는데 드는 횟수는 (2^n)-1 번.

시간복잡도는 O(2^n)

#include void hanoi_tower(int n, char from, char tmp, char to) { if (n == 1) { printf(“No.1 disk moves from %c to %c

“, from, to); } else { hanoi_tower(n – 1, from, to, tmp); printf(“No.%d disk moves from %c to %c

“, n, from, to); hanoi_tower(n – 1, tmp, from, to); } } int main() { hanoi_tower(3,’A’,’B’,’C’); return 0; }

하노이 탑의 함수를 만들어줬다.

n은 원판의 갯수고, from은 첫 막대, tmp는 임시 막대, to는 목적지 막대이다.

만약 원판이 하나면 옮기는 것이다.

from에서 to로.

어? 그럼 1은 무조건 from에서 to로 가는게 아닌가요?

코드로만 보면 그렇게 보이겠지만 하노이 탑 함수 안에 들어있는 재귀함수를 보라.

7번째 줄을 보면 from,to,tmp 따위의 막대들의 위치가 바뀌어 인자로 들어간다.

그러면 tmp 위치에는 to가 들어가고 to 위치에는 tmp가 들어간다.

무슨 소리인가 싶겠지만

1이 있는 막대의 위치에 따라서 1이 A 기둥에도 B 기둥에도 C 기둥에도

어디든지 갈 수 있다는 소리다.

main함수 안에 적어놓은 하노이탑 함수의 첫번째 인자의 숫자를 수정하면

다른 개수의 원판이 옮겨지는 과정도 볼 수 있으니 참고하도록 하자.

원판 개수가 3개일 때를 예로 들어 하나하나 따라가 보자면 아래의 사진과 같다.

소스코드에 대한 예시

아래의 설명을 이해하기 쉽게 들여쓰기로 작성했으니 pc버전에서 보길 권장한다.

원판이 3개일 때 hanoi_tower 함수가 작동하는 과정을 볼 수 있다.

hanoi_tower(3,A,B,C)함수가 선언되었다.

else 문에 걸려서 n-1한 후 hanoi_tower(2,A,C,B)로 가준다.

이 함수는 임시 기둥으로 원판을 다 옮겨준다.

여기서 else문이 걸려서 hanoi_tower(1,A,B,C)로 간다.

1일땐 from에서 to로 옮겨주므로

1을 A->C

다시 hanoi_tower(2,A,C,B)로 돌아가 다음 명령을 실행한다.

n과 from to를 출력하는 것이다.

그러면 2번째 원판이 A에서 B로 옮겨진다.

2를 A->B

그 다음 명령문을 실행한다.

hanoi_tower(1,C,A,B)로 간다.

n은 1이므로 C->B

이제 hanoi_tower(2,A,C,B)는 끝났다. hanoi_tower(3,A,B,C)로 돌아간다.

hanoi_tower(3,A,B,C)의 두번째 명령문을 실행한다.

3을 A->C

hanoi_tower(3,A,B,C)의 세번째 명령문을 실행한다.

hanoi_tower(2,B,A,C)에서 else문에 걸린다.

hanoi_tower(1,B,C,A)가 되면 1을 B->A

다시 돌아와서 hanoi_tower(2,B,A,C)의 두번째 명령문을 실행한다.

2 B->C

hanoi_tower(2,B,A,C)의 세번째 명령문이 실행된다.

hanoi_tower(1,A,B,C)

1 A->C

<함수 종료>

출력 결과

코드를 작성한 후에 어떻게 작동하는지 이해가 간다면 잘 따라잡은 것이다.

비교적 쉬웠던 피보나치 수열보다는 조금 복잡할지는 몰라도 순환을 이해하기 위한 기초 중의 기초니까

기반을 잘 다졌으면 좋겠다.

[c언어] 하노이탑 문제 (문제 설명, 예제)

반응형

하노이의 탑

그림판으로 그린 하노이탑 ~

하노이의 탑은 고대 인도로부터 시작한 일종의 퍼즐입니다.

목표는 아래의 조건을 지키며 한 축에 있는 원반들을 모두 다른 축으로 옮기는 것입니다.

조건

한번의 하나의 원판을 이동할 수 있다.

맨 위에 있는 원판만 이동이 가능하다.

크기가 작은 원판위에 크기가 큰 원판이 올라갈 수 없다.

두 개의 축만 있다면 퍼즐이 불가능하기 때문에 임시의 축을 사용합니다.

예제

다음 예제는 원반의 개수를 입력받고 하노이의 탑을 푸는 예제이다.

A축에 원판이 있고 B축을 이용하여 최종적으로 C축으로 모두 옮기는 과정을 나타내는 예이다.

원판의 크기는 숫자를 통해 나타내었다.

#include void hanoi(int n, char from, char tmp, char to); int main(void) { int n = 0; printf(“원반의 개수를 입력하시오: “); scanf(“%d”, &n); hanoi(n, ‘A’, ‘B’, ‘C’); return 0; } void hanoi(int n, char from, char temp, char to) { if (n == 1) { printf(” 1번 원판을 %c축에서 %c축으로 옮긴다.

“, from, to); } else { hanoi(n – 1, from, to, temp); printf(” %d번 원판을 %c축에서 %c축으로 옮긴다.

“, n, from, to); hanoi(n – 1, temp, from, to); } }

다음은 원판의 개수를 4로 입력하여 받은 결과이다.

이미지 정리

반응형

[C언어] 하노이탑

영화에서 유인원의 지능을 시험할 때 가끔 등장하는 기구..

바로 하노이 탑입니다.

(코딩하다보면 침팬치가 더 똑똑하다 생각이 들 수 있습니다)

하노이탑. (출처:위키백과)

규칙은 단순합니다.

– 한 번에 하나의 원판만 옮길 수 있다.

– 큰 원판이 작은 원판 위에 있어서는 안 된다.

위의 규칙을 지키면서, 맨 왼쪽의 기둥을 맨 오른쪽 기둥으로 옮겨주면 됩니다.

잘 이해가 안된다면, 아래 Gif를 보면 ” 아 이게 그거야~~?! ” 하실겁니다.

하노이탑의 원리. (출처:위키백과)

그럼 이제 해법에 관해 알아보겠습니다.

규칙이 단순한 만큼, 해법도 단순하긴 합니다.

” 원반이 N개일 때, N-1개의 원반을 가운데 기둥으로 옮기고, N번째 원반을 세번째 기둥으로 옮긴다. ”

” 그리고 다시 N-1개의 원반을 세번 째 기둥으로 옮긴다. ”

말로 써보니 무척 쉽습니다.

수식으로도 잠시 알아볼까요?

점화식으로 잘 서술되어있습니다.

결국 최단 이동횟수의 합은 메르센 수입니다.

프로그래밍 언어로 기술한다고 해서 차이가 크치 않습니다.

(물론 표현하는데에 있어 편의성 차이는 큽니다.) (머쓱)

알고리즘을 공부하는데에 있어, C언어만큼 디테일하게 이해할 수 있는 언어는 없을것입니다.

C언어로 작성해 보겠습니다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #define _CRT_SECURE_NO_WARNINGS #include < stdio.h > int hanoi_1( int scale, int from, int temp, int target); int main( void ) { unsigned scale; printf ( “<<하노이의 탑>>

” ); printf ( “숫자 입력 : ” ); scanf ( “%d” , & scale); hanoi_1(scale, 1 , 2 , 3 ); //재귀 실행 } int hanoi_1( int scale, int from, int temp, int target) { if (scale = = 1 ) { //원반이 1개 남았을 때 실행 printf ( “%d번기둥에서 %d번기둥으로

” , from, target); } else { hanoi_1(scale – 1 , from, target, temp); //1번기둥에서 3번기둥을 통해, 2번기둥으로 옮기는 재귀 printf ( “%d번기둥에서 %d번기둥으로

” , from, target); hanoi_1(scale – 1 , temp, from, target); //2번기둥에서 1번기둥을 통해, 3번기둥으로 옮기는 재귀 } } Colored by Color Scripter

줄 별로 나누어서 한번 살펴보겠습니다.

우선

5~9 :

main함수입니다. 실행을 하면,

콘솔창에서 하노이탑 원반의 갯수를 입력받아, hanoi_1이라는 함수에

[ 원반의 갯수, 1, 2, 3 ] 을 전해줍니다.

1, 2, 3은 각각 원반을 지칭하는데에 쓰입니다.

이제 hanoi_1 함수에 대해서 살펴보겠습니다.

아까 살펴본 바와 같이, 하노이탑의 원리는 아래와 같습니다.

” 원반이 N개일 때, N-1개의 원반을 가운데 기둥으로 옮기고, N번째 원반을 세번째 기둥으로 옮긴다. ”

” 그리고 다시 N-1개의 원반을 세번 째 기둥으로 옮긴다. ”

그냥 위의 그 자체입니다.

남은 원반의 갯수가 2개 이상이면 else문에서

” 원반이 N개일 때, N-1개의 원반을 가운데 기둥으로 옮기고, N번째 원반을 세번째 기둥으로 옮긴다. ”

를 실행합니다.

남은 원반의 갯수가 1개 이면 if문에 걸려

” 그리고 다시 N-1개의 원반을 세번 째 기둥으로 옮긴다. ”

를 실행합니다.

그러다 보면 완성됩니다.

.

.

.

.

.

.

.

로 끝나면 뭔가 허전하죠?

횟수를 알아봐야 하지 않을까요?

횟수를 알아내는 코드도 한번 작성해 보았습니다.

1번 코드 :

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #define _CRT_SECURE_NO_WARNINGS #include < stdio.h > int hanoi_2( int scale, int from, int temp, int target); int main( void ) { unsigned scale; printf ( “<<하노이의 탑>>

” ); printf ( “원반개수 : ” ); scanf ( “%d” , & scale); printf ( “총 움직임 횟수 : %d” , hanoi_2(scale, 1 , 2 , 3 )); //재귀 시행 } int hanoi_2( int scale, int from, int temp, int target) { times = 0 ; if (scale = = 1 ) { //원반이 1개 남았을 때 실행 printf ( “%d번기둥에서 %d번기둥으로

” , from, target); times + + ; } else { hanoi_2(scale – 1 , from, target, temp); //1번기둥에서 3번기둥을 통해 2번기둥으로 옮기는 재귀 printf ( “%d번기둥에서 %d번기둥으로

” , from, target); times + + ; hanoi_2(scale – 1 , temp, from, target); //2번기둥에서 1번기둥을 통해, 3번기둥으로 옮기는 재귀 } return times; //printf로 출력하면 중간중간에 계속 찍히는데, return을 통해서 최종 return값이 출력될 수 있도록 함. } Colored by Color Scripter

2번 코드 :

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #define _CRT_SECURE_NO_WARNINGS #include < stdio.h > int hanoi_2( int scale, int from, int temp, int target); int main( void ) { unsigned scale; printf ( “<<하노이의 탑>>

” ); printf ( “원반개수 : ” ); scanf ( “%d” , & scale); printf ( “총 움직임 횟수 : %d” , hanoi_2(scale, 1 , 2 , 3 )); //재귀 시행 } int hanoi_2( int scale, int from, int temp, int target) { static int times = 0 ; if (scale = = 1 ) { //원반이 1개 남았을 때 실행 printf ( “%d번기둥에서 %d번기둥으로

” , from, target); times + + ; } else { hanoi_2(scale – 1 , from, target, temp); //1번기둥에서 3번기둥을 통해 2번기둥으로 옮기는 재귀 printf ( “%d번기둥에서 %d번기둥으로

” , from, target); times + + ; hanoi_2(scale – 1 , temp, from, target); //2번기둥에서 1번기둥을 통해, 3번기둥으로 옮기는 재귀 } return times; //printf로 출력하면 중간중간에 계속 찍히는데, return을 통해서 최종 return값이 출력될 수 있도록 함. } Colored by Color Scripter

두 코드를 올려봤습니다.

1번 코드는 안돌아가고, 2번코드는 돌아갑니다.

.

.

.

.

.

정적 변수를 아십니까?

우리는 보통 변수를 선언할 때,

아래와 같이

1 2 3 4 5 #include < stdio.h > int main( void ){ int a = 0 ; }

선언하곤 합니다.

이렇게 되면 auto 형식의 변수로 선언됩니다.

auto 변수란, 그 해당 블럭에서 실행될 때 메모리에 들어갔다가, 블럭이 종료되면 변수가 해제되어버립니다.

즉, 하노이탑에서 재귀적으로 호출할 때마다 초기화된다는 뜻입니다.

따라서 블럭이 종료되어도 프로그램 전체가 종료될 때까지 버텨주는 변수형식이 필요합니다.

이 때 static 변수를 이용하면 유지킬 수 있습니다.

따라서 2번 코드를 통해 전체 횟수를 세어보면,

메르센 수가 나온다. (메르센 수는 a_n = n^2 – 1 이다. 이 수가 소수이면 메르센 소수라고 한다.)

위와 같이 의도한 결과가 나옴을 관찰할 수 있습니다.

.

.

.

.

.

위의 방법들은 모두 재귀적 호출을 이용하여 프로그램을 구성해 보았습니다.

재귀적 호출 이용이 불가능하다면 어떨까요??

그래서 비재귀 호출에 관해서도 알아보겠습니다.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 #define _CRT_SECURE_NO_WARNINGS #include < stdio.h > #include < stdlib.h > typedef struct stack { //C언어 과제이기 때문에, 스택을 구현한 간단한 구조체 int data; //데이터를 저장 struct stack * link; //스택의 저장위치 기록 } stack ; stack * top; stack * createNode(); void push( int data); //데이터 입력 함수 선언 int pop (); //데이터 출력 함수 선언 int isEmpty(); //스택이 비었는지 확인 함수 선언 int main( void ) { unsigned scale, ch; unsigned from = 1 , temp = 2 , target = 3 , times = 0 ; top = createNode(); //하노이탑을 담을 스택 printf ( “<<하노이의 탑>>

” ); printf ( “원반개수 : ” ); scanf_s( “%d” , & scale); while ( 1 ) { while (scale > 1 ) { //scale이 1일 때 종료. //from에서 temp를 거쳐 target으로 가기위한 과정 push(target);push(temp);push(from); push(scale); scale – – ; //temp와 target 서로 역할 교환 ch = target; target = temp; temp = ch; } printf ( “%d번기둥에서 %d번기둥으로

” , from, target); //원반이 짝수개일 때 첫 target은 2번기둥, 홀수개일 때는 3번기둥 times + + ; if ( ! isEmpty()) { //스택이 비어있지 않을 때 실행 //FILO기 때문에, scale을 먼저 pop scale = pop (); from = pop ();temp = pop ();target = pop (); printf ( “%d번기둥에서 %d번기둥으로

” , from, target); times + + ; scale – – ; //temp와 from 서로 역할 교환 ch = from; from = temp; temp = ch; } else { //스택 비우면 종료. break ; //탈출! } } printf ( “총 움직임 횟수 : %d” , times); return 0 ; } stack * createNode() { stack * p = ( stack * ) calloc ( 1 , sizeof ( stack )); //0으로 초기화하면서 메모리 할당 return p; } void push( int data) { stack * q = createNode(); //노드 생성 q – > data = data; //들어온 데이터를 노드에 입력 q – > link = top – > link; //노드의 주소를 최상단 주소로 재지정 top – > link = q; //최상단 } int pop () { stack * q; int result; q = top – > link; //q는 스택의 최상단 result = q – > data; //최상단의 데이터를 res에 저장 top – > link = q – > link; //최상단 주소 재지정 free (q); //무쓸모 메모리 해제 return result; } int isEmpty() { return top – > link = = NULL ; //스택이 비어있을 때 1 반환 }

우선 제가 써본 코드 전문입니다.

한 파일 안에 작성해보려고 굉장히 난잡한데, 우선 스택에 관해서 알아보겠습니다.

//————————————————–

스택은 가장 흔한 자료구조입니다.

편의점에 알바가 물품 넣는과정, 손님이 빼가는 과정 생각하시면 될것 같습니다.

FILO라고도 하는데, (First In, Last Out)

들어오는 데이터가 그대로 쌓여

가장 먼저 들어온 데이터는 가장 마지막에 나가게 됩니다.

push() : 스택에 데이터를 집어넣습니다.

pop() : 스택의 최상단 데이터를 끄집어냅니다.

isEmpty() : 스택이 비어있는지 프로그램에게 대답합니다. 스택이 손들고 “네!” 또는 “아니오!”로 대답합니다.

//————————————————–

비재귀 문법은 뭔가 말로 설명하기 애매한데, 블럭별로 설명해보겠습니다.

일단 데이터는 4개씩 묶어서 진행합니다.(남은 원반갯수, 현재 기둥, 거쳐갈 기둥, 목표 기둥)

이 블럭은 1번 기둥에서 3번 기둥을 거쳐, 2번기둥까지 N-1개의 원반을 옮기는 경로의 일부를 스택에 쌓아둡니다.

이 블럭은 N번째 기둥을 1번에서 3번으로 넘기고, 2번기둥에서 3번기둥으로 N-1개의 원반을 옮기면서 출력합니다.

뭔가 비재귀로 구현할 때는, 유튜브에서 많은 갯수의 하노이탑을 풀고있는 영상을 천천히 보면서 코딩하면, 무척 큰 도움이 됩니다.

뭔가 모르겠는거는 연락주십시오

행운을 빕니다.

So you have finished reading the c 언어 하노이 탑 topic article, if you find this article useful, please share it. Thank you very much. See more: 하노이탑 재귀호출, 하노이탑 파이썬, 하노이탑 알고리즘, 하노이 탑 재귀 증명, 하노이탑 문제, 하노이 탑 원판 4개, 백준 하노이탑, 하노이탑 점화식

Leave a Comment