Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 계단 오르기

<시간/>

n개의 계단이 있습니다. 한 사람은 1~n계단으로 갑니다. 한 걸음에 얼마나 많은 계단을 넘을 수 있는지도 나와 있습니다. 이 정보를 가지고 n번째 계단으로 갈 수 있는 가능한 방법을 찾아야 합니다. 각 단계에서 최대 두 개의 계단을 건널 수 있다고 가정해 보겠습니다. 따라서 이 문제를 해결하기 위해 재귀 관계를 찾을 수 있습니다. (n-1)번째 계단이나 (n-2)번째 계단에서 n번째 계단으로 이동할 수 있습니다. 그래서 way(n) =way(n-1) + way(n-2).

계단의 수를 10이라고 하고 한 단계에서 점프할 수 있는 최대 계단의 수를 2라고 하면 출력은 가능한 89가지가 됩니다.

이 문제를 해결하려면 다음 단계를 따르십시오 -

  • 계단 번호와 동일한 크기의 배열 개수 정의
  • count[0] :=1
  • for i :=2에서 계단 -1까지, do
    • 카운트[i] :=0
    • j =1 ~ i 및 j <=max; 할
      • count[i] :=count[i] + count[i - j]
  • 반환 횟수[계단 - 1]

더 나은 이해를 위해 구현을 살펴보겠습니다.

예시(C++)

#include<iostream>
using namespace std;
int stairClimbWays(int stair, int max){
   int count[stair]; //fill the result stair using bottom up manner
   count[0] = 1; //when there are 0 or 1 stair, 1 way to climb
   count[1] = 1;
   for (int i=2; i<stair; i++){ //for stair 2 to higher
      count[i] = 0;
      for(int j=1; j<=max && j<=i; j++)
         count[i] += count[i-j];
   }
   return count[stair-1];
}
int countWays(int stair, int max){ //person can climb 1,2,...max stairs at a time
   return stairClimbWays(stair+1, max);
}
int main (){
   int stair, max;
   cout << "Enter number of stairs: "; cin >> stair;
   cout << "Enter max stair a person can climb: "; cin >> max;
   cout << "Number of ways to reach: " << countWays(stair, max);
}

입력

Stairs = 10
Max stairs a person can climb: 2

출력

Enter number of stairs: 10
Enter max stair a person can climb: 2
Number of ways to reach: 89