检查是否可以在C ++的String中多次访问一个单元格

假设我们有一个带点(。)和一个数字的字符串,一个点表示该单元格为空,如果任何单元格中都有一个数字x,则表示我们可以在该字符串内向右或向左移动x步。我们的任务是检查是否可以多次访问一个单元。例如,如果字符串类似于“。2。。。2。”,那么我们可以通过两种不同的方式访问第4个单元格。从第二个单元格到右两步,或者从单元格6到左两步。

我们将使用一个称为Visited []的数组来跟踪可访问字符串的第一个单元格的次数。现在遍历该字符串,并检查当前字符是点还是数字。对于点,不执行任何操作,对于x,则不执行任何操作,对于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