【CSP】试题编号: 201903-4 试题名称: 消息传递接口

该博客主要讨论了一段C++代码,涉及字符串处理和消息传递接口的实现。代码用于处理输入的指令序列,检查是否存在有效的消息传递路径。通过读取每个指令,判断发送(S)和接收(R)操作,确定是否存在环路或无法执行的操作。示例输入和输出展示了程序的运行情况。
摘要由CSDN通过智能技术生成

题目

试题编号: 201903-4
试题名称: 消息传递接口

知识点

字符串处理

代码

#include<bits/stdc++.h>
using namespace std;


int t, n;
int sum = 0;
int tn;
struct node
{
	//int id;
	char option;
	int num;
};

int main()
{
	std::ios::sync_with_stdio(false);
	cin >> t >> n;
	getchar();
	vector<vector<node>>opt(n+1); 
	//vector<node>opt(n + 1);
	for (int i = 0; i < t; i++)//每一组输出一个 
	{
		int flag = 0;
		for (int j = 0; j < n; j++)//读入 
		{
		/*	char x;
			while (scanf("%c", &x) )
			{
				if (x == '\n')
					break;
				if (x == ' ')
				{
					continue;
				}
				else
				{
										sum++;
					int tnum;
					scanf("%d", &tnum);
					node topt = { x,tnum };
					opt[j].push_back(topt);

				}
			}*/
			string s;
			char ch;
			while (cin >> s)
			{
				node x;
				x.option = s[0];
				string t = s.substr(1);//取出第一个字符后的所有数字"15"
				int num = atoi(t.c_str());//转整形
				x.num = num;
				opt[j].push_back(x);
				sum++;
				ch = cin.get();
				if (ch == '\n') break;
				
			}
			
		}

		
		while (sum)
		{
			bool first = true;
			for (int j = 0; j < n; j++)
			{
				if (opt[j].size() != 0)
				{
					int tj = opt[j][0].num;
					if (opt[tj].size() == 0)//判断跳转的是否有命令
					{
						first = false;
						flag = 1;
						sum = 0;
						break;
					}
					if (opt[j][0].option == 'S')//如果是发送
					{
						first = false;
						if (opt[tj][0].option == 'R'&&opt[tj][0].num == j)
						{//匹配删除节点
							//vector<node>::iterator k = opt[j].begin();
							opt[j].erase(opt[j].begin());
							//vector<node>::iterator l = opt[tj].begin();
							opt[tj].erase(opt[tj].begin());
							sum -= 2;
						}
						else
						{
							flag = 1;
							sum = 0;
							break;
						}
					}
				}
			}
			if (first)//如果没有进入过
			{
				first = false;
				flag = 1;
				sum = 0;
				break;
			}
		}

		cout << flag << endl;
		for (int j = 0; j < n; j++)
			opt[j].clear();
		sum = 0;
	}
	return 0;
}

/*
1 3
R1
R2 S0 R0
S1 R1
*/

/*
2 3
R1 S1
R2 S0 R0 S2
S1 R1
R1
R2 S0 R0
S1 R1
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值