题目描述:
Lee正在开发一个多核处理器,
这个处理器由 n 个内核以及 k 个高速缓存(存储单元)组成。
在每个指令周期内,每个内核可以执行一个指令,
该指令可以是空操作或向某个存储单元写入信息。
如果多个内核在同一周期试图向同一个存储单元写入信息,会发生死锁,
导致这些内核和存储单元被锁定。如果一个内核尝试写入一个已锁定的存储单元,
那个内核也会被锁定。研究团队希望模拟这个处理器,探索死锁情况。
输入格式:
第一行包含三个整数 n, m, k(1 <= n, m, k <= 100),分别表示内核数量、周期数量、存储单元数量。
接下来的 n 行描述了每个内核的指令执行情况,每行包含 m 个整数 x[i][1], x[i][2], ..., x[i][m]。其中,x[i][j] 表示第 i 个内核在第 j 个周期执行的指令。指令为 0 表示空操作,指令为 1 到 k 表示向编号为 x 的存储单元写信息。
输出格式:
输出 n 行,每行包含一个整数 t[i],表示第 i 个内核在所有指令执行完成后被锁定的周期编号。如果内核在所有指令执行完成后未被锁定,则 t[i] 为 0。
样例输入1
4 3 5
1 0 0
1 0 2
2 3 1
3 2 0
样例输出1
1 1 3 0
以下是我做的代码
我输入样例1,它输出1 3 3 0
总是和答案输出差一个数字
#include <iostream>
#include <vector>
#include <set>
using namespace std;
int main() {
int n, m, k;
cin >> n >> m >> k;
vector<vector<int>> numbers(n, vector<int>(m));
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
cin >> numbers[i][j];
}
}
set<int> flag; // 存储已锁定的指令单元
vector<int> num(n, 0); // 存储每个核心锁定的周期数
for (int j = 0; j < m; ++j) {
set<int> res; // 存储需要写入的请求
for (int i = 0; i < n; ++i) {
int number = numbers[i][j];
if (number > 0) {
if (flag.count(number) == 0) { // 如果指令未被锁定
flag.insert(number); // 锁定指令
num[i] = j + 1; // 记录锁定周期
} else {
res.insert(i); // 存储写入请求
}
}
}
for (int i : res) {
flag.erase(numbers[i][j]); // 解锁指令
num[i] = 0; // 重置锁定周期
}
}
for (int i = 0; i < n; ++i) {
cout << num[i] << ' '; // 输出每个核心的锁定周期
}
return 0;
}