记录一下,不知道为什么0分
#include<bits/stdc++.h>
using namespace std;
typedef struct
{
string A_name; //权限名
int level; //权限等级
}Authority; //权限结构
typedef struct
{
string R_name; //角色名
int R_nums; //该角色所具有的权限
Authority privilege[11]; //可以存放多个权限,最多10个
}Rols; //角色结构,权限数量不确定
typedef struct
{
string U_name; //用户名
int U_nums; //用户所具有权限个数
Rols U_rols[11]; //用户所具有的权限名
}User;//用户结构
//数据限制,用户、角色、权限均不会超过100
Authority author[101];
Rols rols[101];
User user[101];
int FindRole(string name) //查找是否存在角色
{
for (int i = 0; i < 100; i++)
{
if (rols[i].R_name == name)
{
return i;
}
}
return -1;
}
int FindUser(string name) //查找否存在用户
{
for (int i = 0; i < 100; i++)
{
if (name == user[i].U_name)
{
return i;
}
}
return -1;
}
int main()
{
int p;
cin >> p;
string Instr;
for (int i = 0; i < p; i++)
{
cin >> Instr;
if (Instr.find(":") != string::npos)//有等级权限
{
int pos = Instr.find(":");
author[i].A_name = Instr.substr(0,pos);
author[i].level = Instr[pos + 1] - '0';
}
else
{
author[i].A_name = Instr;
author[i].level = -1; //没有权限
}
}
/***************权限输入正确****************/
int r;
cin >> r;
string Instr2;
for (int i = 0; i < r; i++)
{
cin >> rols[i].R_name >> rols[i].R_nums;
for (int j = 0; j < rols[i].R_nums; j++)
{
cin >> Instr2;
if (Instr2.find(":") != string::npos)//有等级权限
{
int pos = Instr2.find(":");
rols[i].privilege[j].A_name = Instr2.substr(0,pos);
rols[i].privilege[j].level = Instr2[pos + 1] - '0';
}
else
{
rols[i].privilege[j].A_name = Instr2;
rols[i].privilege[j].level = -1;
}
}
}
/**********************角色输入正确*******************************/
int u;
cin >> u;
string Instr3;
for (int i = 0; i < u; i++)
{
cin >> user[i].U_name >> user[i].U_nums;
for (int j = 0; j < user[i].U_nums; j++)
{
cin >> Instr3;
user[i].U_rols[j] = rols[FindRole(Instr3)];
}
}
/********************用户输入正确**********************/
//权限查询部分
int q;
cin >> q;
string F_name; //所查询的名字
string F_pre; //所查询的权限
for (int i = 0; i < q; i++)
{
cin >> F_name;
cin >> F_pre;
int pre_flag = 0; //确定是否有权限
int Max_level = -1; //所查权限将具有的最高权限
if (FindUser(F_name) != -1)//存在该用户
{
User F_u = user[FindUser(F_name)] ;
for (int j = 0; j < F_u.U_nums; j++) //遍历用户查找角色
{
for (int k = 0; k < F_u.U_rols[j].R_nums; k++) //遍历角色查找权限
{
Authority F_a;
if (F_pre.find(":") != string::npos)//有等级权限
{
int pos = F_pre.find(":");
F_a.A_name = F_pre.substr(0,pos);
F_a.level = F_pre[pos + 1] - '0';
}
else
{
F_a.A_name = F_pre;
F_a.level = -1; //没有权限
}
if (F_a.A_name == F_u.U_rols[j].privilege[k].A_name)//若权限名称满足
{
//不分等级权限的不分等级查询
if (F_u.U_rols[j].privilege[k].level == -1 && F_a.level == -1)
{
pre_flag = 1;
}
//分等级权限的不分等级查询
else if (F_u.U_rols[j].privilege[k].level != -1 && F_a.level == -1)
{
if (Max_level < F_u.U_rols[j].privilege[k].level)
{
pre_flag = 1;
Max_level = F_u.U_rols[j].privilege[k].level;
}
}
//分等级权限的分等级查询
else if (F_u.U_rols[j].privilege[k].level != -1 && F_a.level != -1)
{
if (F_a.level <= F_u.U_rols[j].privilege[k].level)
{
pre_flag = 1;
}
}
}
}
}
}
//输出部分
if (pre_flag == 1 && Max_level != 1)
{
cout << Max_level << endl;
}
else if (pre_flag == 1 && Max_level == -1)
{
cout << "true" << endl;
}
else if (pre_flag == 0)
{
cout << "false" << endl;
}
}
return 0;
}