Computer >> Máy Tính >  >> Lập trình >> C ++

Kiểm tra xem một ô có thể được truy cập nhiều lần trong một chuỗi trong C ++ hay không

Giả sử chúng ta có một chuỗi với dấu chấm (.) Và một số, dấu chấm cho biết ô trống và nếu có một số x trong bất kỳ ô nào, nó cho biết rằng chúng ta có thể di chuyển x bước sang phải hoặc sang trái trong chuỗi. Nhiệm vụ của chúng ta là kiểm tra xem chúng ta có thể ghé thăm một ô nhiều hơn một lần hay không. Ví dụ:nếu một chuỗi giống như “. 2. . . 2. . ”, Sau đó chúng ta có thể truy cập ô thứ 4 theo hai cách khác nhau. Từ ô thứ hai sang hai bước sang phải hoặc từ hai bước sang trái từ ô 6.

Chúng tôi sẽ sử dụng một mảng được gọi là đã thăm [] để theo dõi số lần ô thứ i của chuỗi có thể được truy cập. Bây giờ duyệt qua chuỗi và kiểm tra xem ký tự hiện tại là dấu chấm hay một số. Đối với dấu chấm, không làm gì cả, đối với x, hãy tăng số lượng và tăng số lượt truy cập trong mảng đã truy cập trong phạm vi [i - x, i + x] lên 1. Bằng cách duyệt qua mảng đã truy cập, nếu chúng ta nhận được một số phòng được truy cập nhiều lần hoặc không.

Ví dụ

#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";
}

Đầu ra

Tree is level wise Sorted