CCP-CSP認證考試 201612-3 權限查詢 c/c++題解

題目描述

題解:

先聲明一下,只完成了60分(有50%的樣例是 不帶等級權限+不帶等級的查詢,所以我考慮了帶等級的情況,但是沒有考慮好)
我的思路
先來處理輸入

  1. 每個權限作爲一個 pair<string,int>,string表示權限的名字,int表示權限的等級(如果沒有等級就是-1)
  2. 角色作爲一個結構體數組,每個元素保存了名稱、權限數量、具體的權限名稱
  3. 用戶作爲一個結構體數組,每個元素保存了名稱、角色數量、具體的角色名稱
  4. 每次輸入的用戶名和權限名就是string即可
    然後考慮查詢過程
    調用一個 QueryFun(userName,authorization) 函數進行查詢,返回值:
    0:表示查詢不到對應的權限(沒有這個權限 or 對不帶等級權限的 帶等級查詢)
    1:有這個權限(對不帶等級權限 的 不帶等級查詢)

=2:輸出權限的等級(對帶等級權限的的 帶等級查詢 or 對帶等級權限的 不帶等級查詢)
再就是實現QueryFun函數的思路

  1. 首先判斷查詢是否帶等級
  2. 開循環去遍歷:
    遍歷所有的用戶名,如果連要查詢的用戶都沒有就直接return false

代碼:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <climits>
#include <cstring>
#include <string>
#include <algorithm>
#include <vector>
#include <deque>
#include <list>
#include <utility>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <bitset>
#include <iterator>
using namespace std;

typedef long long ll;
const int inf = 0x3f3f3f3f;
const ll  INF = 0x3f3f3f3f3f3f3f3f;
const double PI = acos(-1.0);
const double E = exp(1.0);
const int MOD = 1e9+7;
const int MAX = 1e2+5;

int p;// 不同的權限類別的數量
pair <string,int> Authorization[MAX];// 不同的p個權限(包括帶等級和不帶等級的),權限的等級

int r;// 不同的角色數量
struct Role
{
    string roleName;// 角色的名稱
    int authorizationNum;// 角色的權限數量
    vector <string> roleAuthorization;// 角色擁有的具體權限
};
Role role[MAX];

int u;// 不同的用戶數量
struct User
{
    string userName;// 用戶的名稱
    int roleNum;// 用戶的角色數量
    vector <string> userRole;// 用戶擁有的具體角色
};
User user[MAX];

// 查詢函數主體(給定一個用戶名和一個權限名,根據題目的要求查詢並輸出)
int QueryFun(string userName,string authorization)
{
    /*
        輸出共 q 行,
        每行爲 false、true,或者一個數字。
        false 表示相應的用戶不具有相應的權限,
        true 表示相應的用戶具有相應的權限。
        對於分等級權限的不帶等級查詢,如果具有權限,則結果是一個數字,表示該用戶具有該權限的(最高)等級。
        如果用戶不存在,或者查詢的權限沒有定義,則應該返回 false。
    */
    /* 百分之五十的用例是無關等級的,我先直接拿一半的分數*/
    int levelNum;
    bool judgeLevel;
    string authorizationName;
    int len = authorization.length();
    if(isdigit(authorization[len - 1]))
    {
        // 帶等級的查詢
        judgeLevel = true;
        levelNum = authorization[len-1] - '0';
        authorizationName.assign(authorization,0,len-2);
    }
    else
    {
        // 不帶等級的查詢
        judgeLevel = false;
        levelNum = -1;
        authorizationName.assign(authorization,0,len);
    }

    /* dubug: 輸出查詢的情況
    if(judgeLevel == true)
    {
        cout << "帶等級查詢:" << authorization << endl;
        cout << "權限:" << authorizationName << "等級:" << levelNum << endl;;
    }
    else
    {
        cout << "不帶等級查詢:" << authorization << endl;
        cout << "權限:" << authorizationName << "等級:" << levelNum << endl;;
    }*/

    // 找到指定的用戶userName
    for(int i = 1; i <= u; i++)
    {
        if(user[i].userName == userName)
        {
            // 找到這個用戶的角色,因爲角色會具有一些權限
            for(int j = 0; j < user[i].roleNum; j++)
            {
                for(int k = 1; k <= r; k++)
                {
                    if(role[k].roleName == user[i].userRole[j])
                    {
                        // 找到這個角色的權限
                        for(int m = 0; m < role[k].authorizationNum; m++)
                        {
                            // 不帶等級查詢
                            if(judgeLevel == false)
                            {
                                // 如果用戶的角色有authorization這個權限
                                // 則要判斷該權限有無等級
                                // 1.如果是對 帶等級權限 的 不帶等級查詢,則輸出最高等級
                                // 2.如果是對 不帶等級權限的 的 不帶等級查詢,則輸出true
                                int len = role[k].roleAuthorization[m].length();
                                string tmp;
                                tmp.assign(role[k].roleAuthorization[m],0,len-2);
                                if(isdigit(role[k].roleAuthorization[m][len - 1]))
                                {
                                    if(tmp == authorizationName)
                                    {
                                        //return levelNum;// 不是輸出最高等級嗎
                                        return (role[k].roleAuthorization[m][len - 1] - '0');
                                    }
                                }
                                if(role[k].roleAuthorization[m] == authorizationName)
                                {
                                    return true;
                                }
                            }
                            else// 帶等級查詢
                            {
                                // 如果用戶的角色有authorization這個權限
                                // 則要判斷
                                // 1.如果是對 帶等級權限 的 帶等級查詢,則要判斷等級是否一致,如果一致才能輸出true
                                // 2.如果是對 不帶等級權限的 的 帶等級查詢,則直接輸出false
                                /*
                                if(role[k].roleAuthorization[m] == authorization)
                                {
                                    return true;// 待優化
                                }
                                */
                                int len = role[k].roleAuthorization[m].length();
                                string tmp;
                                tmp.assign(role[k].roleAuthorization[m],0,len-2);
                                if(isdigit(role[k].roleAuthorization[m][len - 1]))
                                {
                                    if(tmp == authorizationName && (role[k].roleAuthorization[m][len - 1] - '0') == levelNum)
                                    {
                                        return true;
                                    }
                                }
                                else
                                {
                                    if(role[k].roleAuthorization[m] == authorizationName)
                                    {
                                        return false;
                                    }
                                }


                            }
                        }
                    }
                }
            }
        }
    }
    // 輸入的用戶對應的權限(不看等級的)存在,在前面就直接返回true了
    return false;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    string str;
    cin >> p;
    for(int i = 1; i <= p; i++)
    {
        cin >> str;
        int len = str.length();
        /* 帶等級的樣例*/
        if(isdigit(str[len-1]))
        {
            // 帶等級的權限
            Authorization[i].second = str[len-1] - '0';
            Authorization[i].first = str.assign(str,0,len-2);
        }
        else
        {
            // 不帶等級的權限
            Authorization[i].second = -1;
            Authorization[i].first = str.assign(str,0,len);
        }

        Authorization[i].second = -1;
        Authorization[i].first = str;
    }
    /* cout << "debug: 權限的情況:" << endl;
    for(int i = 1; i <= p; i++)
    {
        cout << authorization[i].first << endl;
    }*/
    cin >> r;
    for(int i = 1; i <= r; i++)
    {
        cin >> role[i].roleName >> role[i].authorizationNum;
        string authorization;
        for(int j = 1; j <= role[i].authorizationNum; j++)
        {
            cin >> authorization;
            role[i].roleAuthorization.push_back(authorization);
        }
    }
    /* cout << "debug: 角色的情況:" << endl;
    for(int i = 1; i <= r; i++)
    {
        cout << role[i].roleName << " " << role[i].authorizationNum;
        for(auto it = role[i].roleAuthorization.begin(); it != role[i].roleAuthorization.end(); it++)
        {
            cout << " " << *it;
        }
        cout << endl;
    }*/
    cin >> u;
    for(int i = 1; i <= u; i++)
    {
        cin >> user[i].userName >> user[i].roleNum;
        string role;
        for(int j = 1; j <= user[i].roleNum; j++)
        {
            cin >> role;
            user[i].userRole.push_back(role);
        }
    }
    /* cout << "debug: 用戶的情況:" << endl;
    for(int i = 1; i <= r; i++)
    {
        cout << user[i].userName << " " << user[i].roleNum;
        for(auto it = user[i].userRole.begin(); it != user[i].userRole.end(); it++)
        {
            cout << " " << *it;
        }
        cout << endl;
    }*/
    int q;// 查詢次數,用來查詢用戶的權限
    cin >> q;
    string userName,authorization;// 用戶名稱 , 要查詢的權限
    for(int i = 1; i <= q; i++)
    {
        cin >> userName >> authorization;
        int res = QueryFun(userName,authorization);
        if(res == 0)
        {
            cout << "false" << endl;
        }
        else
        {
            if(res == 1)
            {
                cout << "true" << endl;
            }
            else
            {
                cout << res << endl;
            }
        }
    }

    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章