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

C++의 숫자 줄에서 방문한 고유 지점 계산

<시간/>

0과 1의 이진 시퀀스가 ​​주어집니다. 또한 사람이 current_pos에 저장된 위치 또는 지점에 앉아 있다고 가정합니다. 이제 current_pos에서 시작하여 이진 시퀀스가 ​​0이면 왼쪽으로 한 단계 이동합니다( current_pos - 1). 1이면 오른쪽으로 한 단계 이동합니다( current_pos + 1). 목표는 전체 바이너리 시퀀스가 ​​완료된 후 그가 방문한 별개의 위치 또는 지점을 찾는 것입니다.

우리는 포인트를 방문한 횟수를 사용하여 이것을 해결할 것입니다. 빈도가 0이 아닌 경우 고유한 포인트의 수를 늘립니다.

입력

Path[]= “001100” current_pos=3

출력

Distinct points visited on number line: 3

설명 - 경로[0] 및 위치 3에서 시작합니다.

Path[0]: 0 → move left ...currpos=2
Path[1]: 0 → move left ...currpos=1
Path[2]: 1 → move right ...currpos=2
Path[3]: 1 → move left ...currpos=3
Path[4]: 0 → move left ...currpos=2
Path[5]: 0 → move left ...currpos=1

총 고유 위치는 3이며 1,2,3

입력

Path[]= “010101” current_pos=5

출력

Distinct points visited on number line: 2

설명 - 경로[0] 및 위치 5에서 시작합니다.

Path[0]: 0 → move left ...currpos=4
Path[1]: 1 → move right ...currpos=5
Path[2]: 0 → move left ...currpos=4
Path[3]: 1 → move right ...currpos=5
Path[4]: 0 → move left ...currpos=4
Path[5]: 1 → move right ...currpos=5

총 고유 위치는 2이며 4와 5입니다.

아래 프로그램에서 사용된 접근 방식은 다음과 같습니다.

  • 0과 1의 문자열이 경로에 저장됩니다.

  • Current_pos는 시작점을 저장합니다.

  • 함수 getDistinctPoints(int current_pos, string path)는 현재 위치와 경로를 입력으로 받아 고유한 위치/포인트 수를 반환합니다.

  • 변수 len은 경로의 길이를 저장합니다.

  • 배열 빈도[21]는 지점을 방문한 횟수에 대한 빈도를 저장하는 데 사용됩니다. 인덱스는 포인트를 나타냅니다. 총 0-20.

  • 경로 문자열 탐색을 시작합니다.

  • 현재 값이 0이면 왼쪽으로 이동합니다( current_pos -1 ). 이 pointfrequency[current_pos]++의 업데이트 빈도.

  • 그렇지 않으면 현재 값이 1이면 오른쪽으로 이동합니다( current_pos +1 ). 이 pointfrequency[current_pos]++의 업데이트 빈도.

  • 이제 주파수 배열과 0이 아닌 값 각각에 대해 탐색합니다. 수를 늘립니다.

  • 개수에 고유한 방문 지점이 있습니다.

  • 원하는 결과로 카운트를 반환합니다.

예시

#include <bits/stdc++.h>
using namespace std;
//distict points visited between 0 to 20
int getDistinctPoints(int current_pos, string path){
   // Length of path
   int len = path.length();
   int count=0;
   // Array to store number of times a point is visited
   int frequency[21]={0};
   // For all the directions in path
   for (int i = 0; i < len; i++) {
      //for left direction
      if (path[i] == '0') {
         current_pos--;
         frequency[current_pos]++; //increase visit count
      }
      // If the direction is right
      else {
         current_pos++;
         frequency[current_pos]++; //increase visit count
      }
   }
   for(int i=0;i<21;i++)
      if(frequency[i]!=0) // if visted then frequency[i] is non zero
         count++;
   return count;
}
int main(){
   int current_pos = 3;
   string path = "011101100";
   cout << "Count of distinct points visited on the number line:<<(getDistinctPoints(current_pos, path));
   return 0;
}

출력

Count of distinct points visited on the number line :5