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

C++의 문자열에서 셀을 두 번 이상 방문할 수 있는지 확인

<시간/>

점(.)과 숫자가 있는 문자열이 있고 점은 셀이 비어 있음을 나타내고 임의의 셀에 숫자 x가 있으면 문자열 내에서 x 단계를 오른쪽이나 왼쪽으로 이동할 수 있음을 나타냅니다. 우리의 임무는 셀을 두 번 이상 방문할 수 있는지 여부를 확인하는 것입니다. 예를 들어 문자열이 ". 2 . . . 2 . ." 그러면 두 가지 다른 방법으로 4번째 셀을 방문할 수 있습니다. 두 번째 셀에서 오른쪽으로 두 단계 또는 셀 6에서 왼쪽으로 두 단계로 이동합니다.

문자열의 i번째 셀을 방문할 수 있는 횟수를 추적하기 위해 Visit[]라는 배열 하나를 사용합니다. 이제 문자열을 탐색하고 현재 문자가 점인지 숫자인지 확인합니다. 점의 경우 아무 것도 하지 않고 x의 경우 수를 늘리고 [i – x, i + x] 범위 내에서 방문한 배열의 방문 횟수를 1만큼 늘립니다. 한 번 이상.

예시

#include <iostream>
#include <queue>
using namespace std;
class Node {
   public:
   int key;
   Node *left, *right;
};
Node* getNode(int key) {
   Node* newNode = new Node;
   newNode->key = key;
   newNode->left = newNode->right = NULL;
   return newNode;
}
bool isLevelWiseSorted(Node* root) {
   int prevMax = INT_MIN;
   int min_val, max_val;
   int levelSize;
   queue<Node*> q;
   q.push(root);
   while (!q.empty()) {
      levelSize = q.size();
      min_val = INT_MAX;
      max_val = INT_MIN;
      while (levelSize > 0) {
         root = q.front();
         q.pop();
         levelSize--;
         min_val = min(min_val, root->key);
         max_val = max(max_val, root->key);
         if (root->left)
            q.push(root->left);
         if (root->right)
            q.push(root->right);
      }
      if (min_val <= prevMax)
         return false;
         prevMax = max_val;
   }
   return true;
}
int main() {
   Node* root = getNode(1);
   root->left = getNode(2);
   root->right = getNode(3);
   root->left->left = getNode(4);
   root->left->right = getNode(5);
   root->right->left = getNode(6);
   root->right->right = getNode(7);
   if (isLevelWiseSorted(root))
      cout << "Tree is levelwise Sorted";
   else
      cout << "Tree is Not levelwise sorted";
}

출력

Tree is level wise Sorted