CCF CSP 201903-4 消息传递接口 【40分 求大佬指点】

问题描述

试题编号: 201903-4
试题名称: 消息传递接口
时间限制: 1.0s
内存限制: 512.0MB
问题描述:

CCF CSP 201903-4 消息传递接口 【40分 求大佬指点】_第1张图片
CCF CSP 201903-4 消息传递接口 【40分 求大佬指点】_第2张图片
CCF CSP 201903-4 消息传递接口 【40分 求大佬指点】_第3张图片

 

这道题 我的想法是 从第一个进程的 第一个指令 开始匹配  匹配成功 则继续从该进程匹配 如果匹配失败给该线程上锁(vis数组标记  直到匹配成功时才解锁)  就从当前命令指向的进程进行匹配  如果最后全部队列为空 那就说明没有锁死 匹配成功  如果当前线程锁死vis >= 2 说明这些进程的命令形成了闭环  就代表无法匹配成功 

 

思路我感觉没问题  可是 只得了40分  求大佬指点指点

 

写代码的时候自我感觉也算讨了巧  比如  结构体存储数据   结和 myGetLine函数  这样可以简化匹配方式

 

#include
#include
#include
#include

using namespace std;

const int N = 10000+1;

struct Node{
	int flag;
	int no;
};

struct Qu{
	queue q;
	void clear(){
		while(!q.empty()){
			q.pop();
		}
	}
}course[N];

string s;
Node temp,temp2;
int vis[N];


void myGetLine(int x){
	getline(cin,s);
	for(int i = 0; i < s.length();i++ ){
		if(s[i++] == 'S'){
			temp.flag = 1;
		}else{
			temp.flag = 0;
		}
		temp.no = s[i++]-'0';
		course[x].q.push(temp);
	}
}

bool slove(int to,int flag,int n){
	
	//所有进程为空 
	if(flag == n){
		return true;
	}
	
	//形成闭环  
	if(vis[to] >= 2){
		return false;
	}
	
	temp = course[to].q.front();
	temp2 = course[temp.no].q.front();
	
	
	//匹配成功 
	if(temp.flag+temp2.flag == 1 && temp2.no == to){
		
		//线程解锁 
		vis[to] = 0;
		vis[temp.no] = 0;
		
		//消除命令 
		course[to].q.pop();
		course[temp.no].q.pop();
		
		//如果队列清空 做标记 
		if(course[temp.no].q.empty()){
			flag++;
		}
		if(course[to].q.empty()){
			flag++;
			return slove(to+1,flag,n);
		}
				
		return slove(to,flag,n);
		
	}else if(!course[to].q.empty()){
		vis[to]++;
		return slove(temp.no,flag,n);
	}
}

int main()
{
	int t,n;
	scanf("%d%d",&t,&n);
	getchar(); 
	while(t--){
		memset(vis,0,sizeof(vis));
		for(int i = 0; i < n;i++){
			course[i].clear();
			myGetLine(i);
		}
		bool ans = slove(0,0,n);
		printf("%d\n",1-ans);
		
	} 
	return 0;
}

 

你可能感兴趣的:(CCF,CSP)