題目鏈接——L2-037 包裝機
問題分析
這個題目就是模擬了物品在傳送帶和筐之間的傳送過程。傳送帶用隊列模擬,筐用棧模擬。
輸入
3 4 4
GPLT
PATA
OMSA
3 2 3 0 1 2 0 2 2 0 -1
輸出
根據上述操作,輸出的物品順序是:
MATA
樣例分析
初始狀態:
- 筐(棧):空
- 行1:
G
P
L
T
- 行2:
P
A
T
A
- 行3:
O
M
S
A
操作步驟:
- 3(取行3的
O
入筐)→ 筐:[O]
- 2(取行2的
P
入筐)→ 筐:[O, P]
- 3(取行3的
M
入筐)→ 筐:[O, P, M]
- 0(輸出筐頂
M
)→ 輸出:M
,筐:[O, P]
- 1(取行1的
G
入筐)→ 筐:[O, P, G]
- 2(取行2的
A
入筐)→ 筐:[O, P, G, A]
- 0(輸出筐頂
A
)→ 輸出:A
,筐:[O, P, G]
- 2(取行2的
T
入筐)→ 筐:[O, P, G, T]
- 2(取行2的
A
,但筐已滿)→ 先輸出筐頂T
,再入A
→ 輸出:T
,筐:[O, P, G, A]
- 0(輸出筐頂
A
)→ 輸出:A
,筐:[O, P, G]
最終輸出:
- 按順序輸出的字符:
M
A
T
A
→MATA
解題思路
-
數據結構選擇:
- 使用隊列數組
queue<char> q[n + 1]
存儲每行傳送帶上的物品。 - 使用棧
stack<char> stk
模擬筐的存儲。
- 使用隊列數組
-
輸入處理:
- 輸入
n
、m
和mx
,分別表示傳送帶行數、每行物品數和筐的最大容量。 - 讀取每行傳送帶的物品,依次存入對應的隊列。
- 輸入
-
指令處理:
- 循環讀取指令
id
:- 如果
id == -1
,結束程序。 - 如果
id == 0
,從筐頂取物并輸出(若筐不為空)。 - 如果
id > 0
,從第id
行傳送帶取物放入筐(若筐滿則先取筐頂物品輸出)。
- 如果
- 循環讀取指令
-
關鍵點:
- 注意筐的容量限制,滿時需先取再放。
- 注意傳送帶隊列和筐的空狀態,避免非法操作。
具體見代碼
#include<bits/stdc++.h>
#define debug(x) cout<<endl<<"===>"<<#x<<"="<<x<<endl;
#define output(x) cout<<x<<endl;
#define int long long
using namespace std;void solve() {int n, m, mx;//n行,一行m個物品,筐的最大容量cin >> n >> m >> mx;stack<char> stk;//模擬筐的棧queue<char> q[n + 1];//每一行就是一個隊列(下標從1開始)for(int i = 1; i <= n; i++) {string s;//一行的物品cin >> s;for(char c : s) q[i].push(c);}int id;while(cin >> id) {if(id == -1) break;//-1即退出if(id == 0) {//輸出框頂部if(stk.empty()) continue;//注意筐空//輸出筐頂,出棧cout << stk.top();stk.pop();} else {if(q[id].empty()) continue;//注意隊列空//將隊列的東西放入筐之前,檢查是否滿了if(stk.size() == mx) {//如果滿了,就取筐頂cout << stk.top();stk.pop();}//放筐中,出隊列stk.push(q[id].front());q[id].pop();}}
}signed main() {ios::sync_with_stdio(0);cin.tie(0);//while(1)//個人習慣,方便調試solve();return 0;
}