检查是否可以在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