CCF消息传递接口

CCF消息传递接口_第1张图片
CCF消息传递接口_第2张图片
CCF消息传递接口_第3张图片
第一次:
40分,,,,,,
用的就是队列思想,但是C自己定义队列有点麻烦,就这样写了。
首先,选择一个进程序列,从首个进程开始,找到对应的目标序列进行匹配,如果匹配,消掉这俩(如果目标已锁,则解锁),继续从当前序列重复,如果不匹配(可能是跟当前进程匹配的进程在目标序列的内部,故要消掉目标序列的前几个进程,使与当前进程匹配的那个进程露出来),所以对当前序列进行标记后,从目标序列开始继续。互锁的情况是:1、目标为空;2、与目标不匹配且目标已锁。若所有序列都可清空则成功。
只有40的原因可能是这种方式与队列还是有不同,或者是有些地方写错了,不找了好累啊,过段时间在看。
努力!!!
第二次:
本以为只有aim当成一位数这个错误,没想到改了以后还是40,,,,,,我哭了,重新去写!
第三次:
重新用栈写了一个终于满分了,思路译注挺详细的,在原先的代码中找到五六处错误,害怕!
1、aim改成了多位数但是字符串容量忘了扩展;
2、判断互锁时只考虑了目标上锁,漏掉了目标为空;
3、匹配进程时要互相都匹配才可以;
4、循环条件判断不好;
5、手误大意写错了一处地方。
笨是笨了点但是终于满分了哈哈哈哈耐sssssskr~~

#include
#include
#include

typedef struct{
	char op;//操作
	int aim;//目标进程
}processNode;

typedef struct{
	int size;
	int index;
	int lock;
}infoNode;

int T,n;
infoNode Info[10005];//辅助信息列表
processNode Process[10005][9];//进程块

void initInfo()
{
	for(int i=0;i

AC的代码,嘻嘻嘻~~

#include
#include
#include

typedef struct{
	int no;//所处序列号 
	int aim;//目标进程序列号 
	char op;//操作 
}processNode;

typedef struct{
	int size;//序列大小 
	int index;//当前指示 
	int lock;//标记 
}infoNode;

int T,n;
int top;
processNode Stack[100005];//栈定义 
infoNode Info[10005];//辅助信息列表 
processNode Process[10005][9];//进程块 

void initInfo()//每个样例都要进行初始化 
{
	for(int i=0;i<n;++i)
		Info[i].index=Info[i].lock=Info[i].size=0;
}

void createProcess(int i)
{
	char string[60];
	fgets(string,60,stdin);
	char *substr=strtok(string," \n");
	while(substr){
		Process[i][Info[i].size].no=i;
		Process[i][Info[i].size].op=substr[0];
		Process[i][Info[i].size++].aim=atoi(&substr[1]);//不一定是一位数 
		substr=strtok(NULL," \n");
	}
}

int findStart()//寻找不空且未锁的序列 
{
	for(int i=0;i<n;++i)
	    if(Info[i].index<Info[i].size&&Info[i].lock==0) return i;
	return -1;
}

int Match(processNode A,processNode B)//两个进程进行匹配 
{
	if(A.aim==B.no&&B.aim==A.no&&A.op!=B.op) return 1;
	return 0;
}

int Judge()
{
	int start,aim;
	start=findStart();
	Stack[++top]=Process[start][Info[start].index++];//第一个进程入栈 
	Info[start].lock=1;//为其上锁 
	while(1){
		aim=Stack[top].aim;//目标序列 
		if(Info[aim].index==Info[aim].size||Info[aim].lock==1) return 0;//目标序列为空或已上锁则互锁 
		if(Match(Stack[top],Process[aim][Info[aim].index])){//匹配成功 
			Info[Stack[top].no].lock=0;//解锁栈顶 
			top--;//出栈 
			Info[aim].index++;//消掉目标进程 
			if(top==-1){//如果此时栈空,需找新的进程入栈 
				start=findStart();
				if(start==-1) return 1;//如果没找到,又因为若有序列因上锁而未被找出,则栈必不空,故进程块全空 
				else Stack[++top]=Process[start][Info[start].index++];
				Info[start].lock=1;//找到则进栈上锁 
			}
		}else{//匹配不成功,则目标进程进栈 
			Stack[++top]=Process[aim][Info[aim].index++];
			Info[aim].lock=1;
		}
	}
}

int main()
{
	scanf("%d%d",&T,&n);
	getchar();
	for(int i=0;i<T;++i){
		top=-1;
		initInfo();
		for(int j=0;j<n;++j)
	    	createProcess(j);
	    if(Judge()) printf("0\n");
	    else printf("1\n");
	}
	return 0;
}

你可能感兴趣的:(C)