题意
有n个进程互相通信,每个进程只会两种操作发送信息和接受信息,每个进程会有一个任务队列,队列中的任务必须挨个执行,让你判断是否会死锁
思路
首先每个队列建立一个任务队列,队列使用deque
每次取出一个任务
vector<deque<pair<char, int>>> processes;//全部进程的任务队列
建立两个map当有暂时不能匹配的接受信息和发送信息时存入map
unordered_map<int, int> rec, send;//键为自身进程,值为目标进程
维护一个任务栈首先初始化将n个任务压入,然后在循环中依次取出直到栈空结束循环,每当匹配成功时将匹配成功的两个进程压入栈(这种方法可以处理超出题目限制的8条以上的任务)
deque<int> taskque;
for (int i = 0; i < n; ++i)taskque.push_back(i);//初始化,把0到n-1条进程压入栈
结果判断,当rec和send全部为空时无死锁
代码
#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <vector>
#include <deque>
#include <unordered_map>
using namespace std;
int t, n;
vector<deque<pair<char, int>>> processes;//全部进程的任务队列
void execute() {
unordered_map<int, int> rec, send;//键为自身进程,值为目标进程
deque<int> taskque;
for (int i = 0; i < n; ++i)taskque.push_back(i);//初始化,把0到n-1条进程压入栈
while (!taskque.empty()) {
int cur = taskque.front();
taskque.pop_front();
if (processes[cur].empty())continue;//进程内无任务跳过
int num = processes[cur].front().second;
if (processes[cur].front().first == 'S') {
auto rp = rec.find(num);
if (!rec.empty() && rp != rec.end() && rp->second == cur) {//如果目标进程正等待本进程的发送数据
processes[num].pop_front();
processes[cur].pop_front();//将自身进程和目标进程弹出一个任务
taskque.push_front(num);
taskque.push_front(cur);//将自身进程和目标进程压入栈
rec.erase(num);
}
else
send.insert({ cur,num });
}
else {
auto sp = send.find(num);
if (!send.empty() && sp != send.end() && sp->second == cur) {
processes[num].pop_front();
processes[cur].pop_front();
taskque.push_front(num);
taskque.push_front(cur);
send.erase(num);
}
else
rec.insert({ cur,num });
}
}
if (rec.empty() && send.empty())cout << '0' << endl;
else cout << '1' << endl;
}
//#define DEBUG
int main()
{
#ifdef DEBUG
fstream cin("input.txt");
#endif // DEBUG
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> t >> n;
cin.get();
for (; t != 0; --t) {
processes.resize(n);
for (int i = 0; i < n; ++i) {
stringstream strs;
string temp;
getline(cin, temp);
strs << temp;
int num; char c;
while (strs >> c >> num)
processes[i].push_back({ c,num });
}
execute();
processes.clear();
}
}
看完觉得还可以记得点个赞啊
测试数据
//官方数据
2 3
R1 S1
R2 S0 R0 S2
S1 R1
R1
R2 S0 R0
S1 R1
//自己设的数据
1 5
S1 S1 S1 S1 R4 R4 R4 R4
R0 R0 R0 R0 S2 S2 S2 S2
R1 R1 R1 R1 S3 S3 S3 S3
R2 R2 R2 R2 S4 S4 S4 S4
R3 R3 R3 R3 S0 S0 S0 S0
//结果为0