在 C++ 中打印移动方向,使其保持在 [-k, +k] 的边界内
在这个问题中,我们必须找到一种有效的方法来移动正方向或负方向,以便我们保持在用户提供的某个限制范围内。
这里,我们给定一个最大限制 K,它是我们可以移动到的最大值,以及一个包含 n 个正值的数组。我们必须返回序列,即正或负方向的移动,以便它永远不会超过 K 值。
让我们举个例子来更好地理解这个主题,
Input : K = 56 and the array is [25 , 14 , 31 , 16 , 5]. Output : positive positive negative positive positive.
解释
首先,我们将检查 0 + a[0] = 0 + 25 = 25 < 56 是否成立,如果成立,我们将向正方向移动。
现在,我们将检查 25 + a[1] = 25 + 14 = 39 < 56 是否成立,如果成立,我们将向正方向移动。
现在,我们将检查 29 + a[2] = 39 + 31 = 70 < 56 是否成立,如果不成立,我们将检查 39 - a[2] = 39 - 31 = 8 > 0 是否成立,如果成立,我们将向负方向移动。
我们将检查 8 + a[3] = 8 + 16 = 24 < 56 是否成立,如果成立,我们将向正方向移动。
我们将检查 16 + a[4] = 16 + 5 = 21 < 56 是否成立,如果成立,我们将向正方向移动。
所以,现在让我们创建逻辑来解决这个问题。我们必须检查向正方向移动是否会达到限制。如果没有,则向正方向移动。否则,检查向负方向移动是否会达到下限,即 0。如果没有,则向负方向移动。如果两者都成立,则返回“不可能”。
基于此逻辑,我们必须遵循的用于创建代码的算法是:
算法
Initially set position to 0. Step 1 : for i -> 0 to n , n is the length of array. Follow step 2 - 4. Step 2 : if initial_postition + a[i] < K, initial_position + = a[i]. Print “POSITIVE”. Step 3 : else if initial_postition - a[i] > 0, initial_position - = a[i]. Print “NEGATIVE”. Step 4 : else , print “NO MORE VALID MOVES”.
示例
现在,让我们创建一个程序来展示实现该算法以解决问题的过程,
#include <iostream> using namespace std; void StepsTaken(int a[], int n, int k){ string res = ""; int position = 0; int steps = 1; for (int i = 0; i < n; i++) { if (position + a[i] <= k && position + a[i] >= (-k)) { position += a[i]; cout<<"POSITIVE \t"; } else if (position - a[i] >= -k && position - a[i] <= k) { position -= a[i]; cout<<"NEGATIVE \t"; } else { cout << -1; return; } } cout << res; } int main(){ int a[] = { 12 , 24 , 9 , 17 , 8}; int n = sizeof(a) / sizeof(a[0]); int k = 40; StepsTaken(a, n, k); return 0; }
输出
POSITIVE POSITIVE NEGATIVE NEGATIVE POSITIVE
广告