我不明白我的计划中有什么问题

时间:2018-04-28 14:08:50

标签: c++

这是一个编程问题,并没有给出所有案例的正确答案

你正在玩一个视频游戏,其中几个盒子排列在地板上,顶部有一个起重机重新排列盒子

起重机支持以下命令:

•向左移动一个位置(如果已经位于最左侧位置则不执行任何操作)

•向右移动一个位置(如果已经位于最右侧位置则不执行任何操作)

•从当前堆栈中取出一个盒子(如果起重机已有盒子,则不执行任何操作)

•在当前堆栈上放一个盒子(如果起重机没有盒子,则什么都不做)

此外,每个堆叠上的盒子数量存在限制H.如果'掉落'命令将导致堆栈具有多于H个框,起重机忽略此drop命令。如果当前堆栈没有盒子,那么就可以选择'命令被忽略。

您将获得每个堆栈中的初始箱数以及起重机执行的操作顺序。您必须计算每个堆栈中的最终箱数。

输入格式 •第1行:游戏的宽度(盒子的堆叠数量),N,然后是每个堆栈的最大高度H.

•第2行:N个整数,每个堆栈中的初始框数,从左到右。每个数字都是≤H。

•第3行:一系列整数,每个整数都为起重机编码。

The commands are encoded as follows:

1 : Move left

2 : Move right

3 : Pick up box

4 : Drop box

0 : Quit

•命令Quit(0)只出现一次,是最后一个命令。

•起重机的初始位置位于最左侧的堆叠上方,起重机没有任何箱子。

#include<iostream>
#include<iomanip>
#include<algorithm>
#include<vector>
using namespace std;
int main()
{
    long long x, y, t;
    cin >> x >> y;
    cout << endl;
    vector<long long> stack(x);
    for (long long i = 0; i < x; i++)
    {
        cin >> stack[i];
    }
    cout << endl;
    vector<long long>::pointer ptr = &stack[0];
    while (cin >> t)
    {
        if (t == 1)
        {
            if (ptr != &stack[0])
                ptr--;

        }
        if (t == 2)
        {
            if (ptr != &stack[x - 1])
                ptr++;
        }
        if (t == 3)
        {
            if (*ptr != 0)
                *ptr = *ptr - 1;
        }
        if (t == 4)
        {
            if (*ptr < y)
                *ptr = *ptr + 1;
        }
        if (t == 0)
            break;
    }
    cout << endl;
    for (long long i = 0; i < x; i++)
    {
        cout << stack[i];
    }
    return 0;
}

1 个答案:

答案 0 :(得分:1)

该计划存在多种问题:

  • 程序不会检查起重机在上下车时是否拿着箱子。这就是造成意外输出的原因。

  • 程序将所有逻辑放在一个函数(main)中,这使得遵循程序逻辑变得更加困难。

  • 程序使用指向起重机所在堆栈的指针,而不是简单地使用位置索引。这也使得逻辑更难以阅读。

  • 该程序使用一系列if语句而不是单个switch语句,这再次模糊了逻辑。

  • 该程序使用变量名xy,这些名称不能描述其功能,再次使程序更难以遵循。而是使用numberOfStacksmaxHeight或类似内容,或至少NH与问题描述相关联。

除了第一点之外的所有内容都可能是&#34;小&#34;事情,它是一个简短的程序,并不难阅读,但如果你遵循这个建议会更容易,更容易发现错误(并找出第一点)。

使用位置而不是指针,使用switch语句并分离成自己的函数的示例:

void processCommands(vector<std::size_t>& stack, std::size_t maxHeight) {
   std::size_t position = 0;
   bool holdingBox = false;
   while (cin >> t) {
      switch (t) {
      case 1:
         if (position != 0)
            --position;
         break;
      case 2:
         if (position != stack.size() - 1)
            ++position;
         break;
      case 3:
         if (!holdingBox && stack[position] != 0) {
            --stack[position];
            holdingBox = true;
         }
         break;
      case 4:
         if (holdingBox && stack[position] != maxHeight) {
            ++stack[position];
            holdingBox = false;
         }
         break;
      case 0:
         return; // Exits current function, return to main where stack is printed
      }
   }
}

(我还为long long替换了std::size_t,我认为这更好地代表了这些值的功能(数组的大小和堆栈的大小)。std::size_t是一个无符号的长long在64位计算机上。也许unsigned int就足够了。

Main可能如下所示:

int main() {
   vector<std::size_t> stack;
   std::size_t maxHeight = initializeStack(stack);
   processCommands(stack, maxHeight);
   printStack(stack);
}