我正在编写一个程序来解决这个问题:
库存储存容器与各种N的货物。所有 容器以N堆栈形式写入。在每个堆栈中可以是容器 与任何物种的货物(堆栈最初可能是空的)。
叉车可以将任何顶部集装箱堆放在上面 任何堆栈。你必须把所有容器都装上了产品 第一种堆栈中的第一种,第二种类型 - 第二种堆栈, 等
程序应该打印叉车或消息的动作序列 说明问题没有解决方案。
输入格式
第一行输入包含单个正整数N,但不包含 超过500。接下来的N行首先描述容器的堆栈 由ki记录 - 堆栈中的容器数量,然后是ki 属性 - 从底部到堆栈中的容器中的货物类型 起来在每个堆栈的开头不超过500个容器( 运输过程中的容器可能会破坏这种限制)。产量 数据格式程序应打印卡车的描述 动作:对于每个动作类型两个数字 - 从中获取 放置的容器堆栈和堆栈。 (注意尽量减少金额 卡车运营不是必需的。 )如果没有解决方案,你 需要显示一个数字0。如果容器最初 正确放入桩中,输出不需要任何东西。
示例:
输入:
3
4 1 2 3 2
0
0
输出:
1 2
1 3
1 2
所以,我写了一个程序。你可以看到下面的代码:
#include <iostream>
using namespace std;
// Здесь, короче, стек.
struct Node{
int data;
Node *next;
};
Node* push(Node *start, int d){
Node *a = new Node;
a -> data = d;
a -> next = start;
return a;
}
Node* pop(Node *s, int &d){
d = (s -> data);
Node *a = s -> next;
delete s;
return a;
}
void move(Node **stack, int from, int to, int save, int *size, int *number){
int k = 0;
while(size[to] != number[to]){
stack[from] = pop(stack[from], k);
if(k - 1 == to){
stack[to] = push(stack[to], k);
size[to]++;
cout << from + 1 << " " << to + 1 << endl;
}
else{
stack[save] = push(stack[save], k);
size[save]++;
cout << from + 1 << " " << save + 1 << endl;
}
size[from]--;
}
if(save > to){
while(size[save] != number[save]){
stack[save] = pop(stack[save], k);
stack[from] = push(stack[from], k);
size[save]--;
size[from]++;
cout << save + 1 << " " << from + 1 << endl;
}
}
else{
while(size[save] != 0){
stack[save] = pop(stack[save], k);
stack[from] = push(stack[from], k);
size[save]--;
size[from]++;
cout << save + 1 << " " << from + 1 << endl;
}
}
}
void to_one(Node **stack, int to, int m, int *size){
int k = 0;
for(int i = to + 1; i < m; i++){
while(size[i] != 0){
stack[i] = pop(stack[i], k);
stack[to] = push(stack[i], k);
size[to]++;
size[i]--;
cout << i + 1 << " " << to + 1 << endl;
}
}
}
int main(){
int n = 0;
int k = 0;
cin >> n;
Node **stack = new Node*[n]; // наши полки
int *size = new int[n]; // количество элементов на каждой полке изначально
int *number = new int[n]; // количество элементов соответствующего типа
for(int i = 0; i < n; i++) number[i] = 0;
for(int i = 0; i < n; i++){
cin >> size[i];
for(int j = 0; j < size[i]; j++){
cin >> k;
number[k - 1]++;
stack[i] = push(stack[i], k);
} // формируем наши полки
}
int from = 0;
int m = n; // вспомогательная переменная количества неотсортированных полок
//сперва все перенесем в одну полку (первую)
to_one(stack, from, m, size);
int save = 1; // вспомогательная
//Теперь восстановим последнюю стопку, а вспомогательной будет вторая.
int to = m - 1;
move(stack, from, to, save, size, number);
//Теперь наша готовая последняя стопка станет резервной навсегда.
save = to;
//А теперь отдельно рассмотрим полки между последней и первой, повторив цикл выше.
m--;
for(int i = m; i > from; i--){
to = i - 1;
to_one(stack, from, i, size);
move(stack, from, to, save, size, number);
}
delete []number;
delete []size;
return 0;
}
我试着调试它,这就是我得到的。 我的意见是:
4
4 1 2 3 4
1 3
3 2 1 4
3 2 1
程序在此输出后崩溃:
2 1
3 1
3 1
3 1
4 1
4 1
1 2
截图:
我不知道为什么会收到此错误。 请帮帮我。
答案 0 :(得分:0)
问题在于
stack[to] = push(stack[i], k);
应该是
stack[to] = push(stack[to], k);
感谢Joe Z。