CCF 201903-4 消息传递接口 100分

在这里插入图片描述

题意

有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


发布了8 篇原创文章 · 获赞 6 · 访问量 536

猜你喜欢

转载自blog.csdn.net/qq_41433566/article/details/105497974
今日推荐