CCF CSP认证 201612-3 权限查询

用C语言完成的一道题目使用的是CCF官方指定的Dev-CPP 5.4.0 (Min GW 4.7.2),本地测试样例可以通过,但不知为什么提交到平台后出错,也没有提示编译错误,先放到这里,以后再说。

坑爹的CCF~~~

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

typedef struct privilegeNode {
	char name[40];
	int level;//-1表示没有等级
}privilege;
typedef struct roleNode {
	char name[40];
	int privilegeNum;
	privilege privileges[10];
}role;

typedef struct userNode {
	char name[40];
	int roleNum;
	role roles[10];
}user;
privilege privileges[100];
role roles[100];
user users[100];
int p, r, u, q;
char temp[100];
int* outcome;
int mystrcmp(char* a, char* b, int bstart)
{
	int i = 0;
	int j = bstart;
	while (1)
	{
		if (a[i] != b[j])
		{
			return 0;
		}
		else if (a[i] == '\0')
		{
			return 1;
		}
		i++;
		j++;
	}
	return 0;
}
void saveRole(int no)
{
	int cur = 0;
	int num = 0;
	int i;
	int j;
	int tag = 0;
	while (1)
	{
		if (temp[cur] != ' ')
		{
			roles[no].name[cur] = temp[cur];
			cur++;
		}
		else
		{
			cur++;
			break;
		}
	}
	num = temp[cur] - '0';
	cur++;
	if (temp[cur] >= '0'&&temp[cur] <= '9')
	{
		num = num * 10 + (temp[cur] - '0');
		cur++;
	}
	while (temp[cur] == ' ')
	{
		cur++;
	}
	roles[no].privilegeNum = num;
	for (i = 0; i < num; i++)
	{
		j = 0;
		tag = 0;
		while (temp[cur] != ' ')
		{
			if (temp[cur] == '\0' || temp[cur] == '\n')
			{
				break;
			}
			if (temp[cur] == ':')
			{
				cur++;
				roles[no].privileges[i].level = temp[cur] - '0';
				cur++;
				tag = 1;
				break;
			}
			else
			{
				roles[no].privileges[i].name[j] = temp[cur];
				j++;
				cur++;
			}
		}
		roles[no].privileges[i].name[j] = '\0';
		if (tag == 0)
		{
			roles[no].privileges[i].level = -1;
		}
		while (temp[cur] == ' ')
		{
			cur++;
		}
	}
}
void saveUser(int no)
{
	int cur = 0;
	int num = 0;
	int i;
	int t;
	int j;
	while (1)
	{
		if (temp[cur] != ' ')
		{
			users[no].name[cur] = temp[cur];
			cur++;
		}
		else
		{
			cur++;
			break;
		}
	}
	num = temp[cur] - '0';
	cur++;
	if (temp[cur] >= '0'&&temp[cur] <= '9')
	{
		num = num * 10 + (temp[cur] - '0');
		cur++;
	}
	while (temp[cur] == ' ')
	{
		cur++;
	}
	users[no].roleNum = num;
	for (i = 0; i < num; i++)
	{
		j = 0;
		while (temp[cur] != ' '&&temp[cur] != '\0'&&temp[cur] != '\n')
		{
			users[no].roles[i].name[j] = temp[cur];
			j++;
			cur++;
		}
		users[no].roles[i].name[j] = '\0';
		for (j = 0; j < r; j++)
		{
			t = mystrcmp(users[no].roles[i].name, roles[j].name, 0);
			if (t == 1)
			{
				users[no].roles[i] = roles[j];
				break;
			}
		}
		while (temp[cur] == ' ')
		{
			cur++;
		}
	}
}

void query(int no)
{
	char name[40];
	char privi[40];
	int t;
	int level, toplevel = -1;
	int tag = 0;//是否有等级
	int cur = 0, i, j, k;
	int hit = 0;
	int istrue = 0;
	while (temp[cur] != ' ')
	{
		name[cur] = temp[cur];
		cur++;
	}
	name[cur] = '\0';
	cur++;
	j = 0;
	while (temp[cur] != ' ')
	{
		if (temp[cur] == '\0' || temp[cur] == '\n')
		{
			break;
		}
		if (temp[cur] == ':')
		{
			cur++;
			tag = 1;
			level = temp[cur] - '0';
			cur++;
		}
		else {
			privi[j] = temp[cur];
			cur++;
			j++;
		}
	}
	privi[j] = '\0';
	//begin query
	for (i = 0; i < u; i++)
	{
		t = mystrcmp(users[i].name, name, 0);
		if (t == 1)
		{
			for (j = 0; j < users[i].roleNum; j++)
			{
				for (k = 0; k < users[i].roles[j].privilegeNum; k++)
				{
					t = mystrcmp(privi, users[i].roles[j].privileges[k].name, 0);
					if (t == 1)
					{
						if (tag == 1)
						{
							if (users[i].roles[j].privileges[k].level >= level)
							{
								hit = 1;
								istrue = 1;
								outcome[no] = -1;
							}
						}
						else
						{
							hit = 1;
							istrue = 1;
							if (users[i].roles[j].privileges[k].level > -1)
							{
								if (users[i].roles[j].privileges[k].level > toplevel)
								{
									toplevel = users[i].roles[j].privileges[k].level;
									outcome[no] = toplevel;
								}
							}
							else
							{
								outcome[no] = -1;
							}

						}
					}
				}
			}

		}
	}
	if (hit == 0 && tag == 1)
	{
		outcome[no] = -2;
	}
	if (istrue == 0)
	{
		outcome[no] = -2;
	}
	return;
}

int main()
{
	int i;
	scanf("%d", &p);
	getchar();
	for (i = 0; i < p; i++)
	{
		fgets(temp, 100, stdin);
	}
	scanf("%d", &r);
	getchar();
	for (i = 0; i < r; i++)
	{
		fgets(temp, 100, stdin);
		//gets_s(temp,100);
		saveRole(i);
	}
	scanf("%d", &u);
	getchar();
	for (i = 0; i < u; i++)
	{
		fgets(temp, 100, stdin);
		//gets_s(temp,100);
		saveUser(i);
	}
	scanf("%d", &q);
	getchar();
	outcome = (int*)malloc(sizeof(int)*q);
	for (i = 0; i < q; i++)
	{
		fgets(temp, 100, stdin);
		//gets_s(temp,100);
		query(i);
	}
	for (i = 0; i < (q - 1); i++)
	{
		if (outcome[i] == -1)
		{
			printf("ture\n");
		}
		else if (outcome[i] == -2)
		{
			printf("false\n");
		}
		else
		{
			printf("%d\n", outcome[i]);
		}
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值