这是一个编程问题,并没有给出所有案例的正确答案
你正在玩一个视频游戏,其中几个盒子排列在地板上,顶部有一个起重机重新排列盒子
起重机支持以下命令:
•向左移动一个位置(如果已经位于最左侧位置则不执行任何操作)
•向右移动一个位置(如果已经位于最右侧位置则不执行任何操作)
•从当前堆栈中取出一个盒子(如果起重机已有盒子,则不执行任何操作)
•在当前堆栈上放一个盒子(如果起重机没有盒子,则什么都不做)
此外,每个堆叠上的盒子数量存在限制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;
}
答案 0 :(得分:1)
该计划存在多种问题:
程序不会检查起重机在上下车时是否拿着箱子。这就是造成意外输出的原因。
程序将所有逻辑放在一个函数(main
)中,这使得遵循程序逻辑变得更加困难。
程序使用指向起重机所在堆栈的指针,而不是简单地使用位置索引。这也使得逻辑更难以阅读。
该程序使用一系列if
语句而不是单个switch
语句,这再次模糊了逻辑。
该程序使用变量名x
和y
,这些名称不能描述其功能,再次使程序更难以遵循。而是使用numberOfStacks
和maxHeight
或类似内容,或至少N
和H
与问题描述相关联。
除了第一点之外的所有内容都可能是&#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);
}