输入:
- 第一行三个正整数 M,N,Q,表示小美书架有 N 行编号 1 到 N ,书本编号从 1 到 M ,接下来有 Q 个操作
- 接下来 Q 行,每行是下列操作中的一种:
- x y : x 是书本的编号,y 是书架的行编号,代表小美将编号为 x 的书本放置到 y 行上。若该书本在小团手上则放置无效,若原来该书在书架上且原行上锁则放置无效,若该书被放置到一个锁了的行上则放置无效。
- y : y 是书架的行编号,代表小美将行编号为 y 的书架加锁,对已经上锁的书架行该操作无效。
- y : y 是书架的行编号,代表小美将行编号为 y 的书架锁去掉,对无锁的书架行该操作无效。
- x : x 是书本的编号,代表小团想借编号为 x 的书本,对该操作若可以借到输出一行正整数在哪一行,借不到输出一行 -1
- x : x 是书本的编号,代表小团还回来编号为 x 的书本。若该书本不在小团手上该操作无效。
输出:
- 对于每个操作 4 ,若可以借到输出一行正整数在哪一行,借不到输出一行 -1 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/FvoBGh
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
输入:
5 5 10
1 1 4
1 2 3
1 3 1
2 1
4 1
5 2
4 3
4 5
3 1
4 2
输出:
4
-1
-1
3
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/FvoBGh
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
#include<cstdio>
#include<cstring>
using namespace std;
int main() {
int m, n, q;
scanf("%d %d %d", &m, &n, &q);
int book[m + 1]; // 1~m号书在哪行书架上,0表示未上架,-1表示借出
memset(book, 0, sizeof(book));
int locked[n + 1]; // 1~n行书架是否加锁
memset(locked, 0, sizeof(locked));
for (int i = 0; i < q; ++i) {
int c;
scanf("%d", &c);
switch(c) {
int x, y;
case 1:
scanf("%d %d", &x, &y);
if (locked[y] == 0 && (book[x] == 0 || book[x] > 0 && locked[book[x]] == 0))
book[x] = y;
break;
case 2:
scanf("%d", &y);
locked[y] = 1;
//1表示对这一行的书本进行加锁
break;
case 3:
scanf("%d", &y);
locked[y] = 0;
break;
case 4:
scanf("%d", &x);
if (book[x] > 0 && locked[book[x]] == 0) { // 上架且未上锁的书才可以借出
printf("%d\n", book[x]);
book[x] = -1; // 借出
}
else
printf("-1\n");
break;
case 5:
scanf("%d", &x);
if (book[x] == -1)
book[x] = 0; // 还书,变为未上架状态
break;
}
}
return 0;
}
/*作者:xgn911
链接:https://leetcode-cn.com/problems/FvoBGh/solution/cyong-shu-zu-shi-xian-ha-xi-by-xgn911-bh8i/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/