2020年冬季pat认证

D.

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e2 + 7;
vector<vector<int> > from[MAXN];
int a[MAXN], b[MAXN], vis[MAXN], n, m, r;
vector<int> tmp[MAXN];
vector<int> ret;
vector<vector<int> > ans;
int cal(vector<int> a, vector<int> b) {
    int len = min(a.size(), b.size());
    for (int i = 0; i < len; i++) {
        if (a[i] < b[i]) return -1;
        else if (a[i] > b[i]) return 1;
    }
    if (a.size() == b.size()) return 0;
    else if (a.size() > b.size()) return 1;
    else return -1;
} // a大于b是1,小于b是-1,等于是0
void dfs(int p) {
    if (p == m + 1) {
        vector<int> temp;
        for (int i = 1; i <= m; i++) {
            for (int j = 0; j < tmp[i].size(); j++) {
                // printf("%d ", tmp[i][j]);
                temp.push_back(tmp[i][j]);
            }
            //  printf("\n");
        }
        if (ret.empty()) {
            ret = temp;
            for (int i = 1; i <= m; i++) ans.push_back(tmp[i]);
        }
        else {
            int now = cal(temp, ret);
            if (now == -1) {
                ans.clear();
                for (int i = 1; i <= m; i++) ans.push_back(tmp[i]);
            }
        }
        //printf("\n\n");
        return;
    }
    for (int k = 0; k < from[b[p]].size(); k++) {
        bool ok = true;
        vector<int> now = from[b[p]][k];
        for (int i = 0; i < now.size(); i++) {
            int x = now[i];
            if (!vis[x]) ok = false;
        }
        if (ok && now.size()) {
            tmp[p] = now;
            for (int i = 0; i < now.size(); i++) {
                int x = now[i];
                vis[x] = 0;
            }
            dfs(p + 1);
            for (int i = 0; i < now.size(); i++) {
                int x = now[i];
                vis[x] = 1;
            }
        }
    }
}
int main() {
    int x;
    string s;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
        scanf("%d", &a[i]), vis[a[i]] = 1;
    // printf("ok\n");
    scanf("%d", &m);
    for (int i = 1; i <= m; i++)
        scanf("%d", &b[i]), vis[b[i]] = 1;
    scanf("%d", &r);
    getchar();
    //printf("ok\n");
    for (int i = 1; i <= m; i++) {
        vector<int> now;
        now.push_back(b[i]);
        from[b[i]].push_back(now);
    }
    for (int i = 1; i <= r; i++) {
        getline(cin, s);
        vector<int> temp;
        int p = 0;
        while (s[p] != '-') {
            if (s[p] < '0' || s[p] > '9') {
                p++;
                continue;
            }
            x = 0;
            while (s[p] >= '0' && s[p] <= '9') {
                x = x * 10 + s[p] - '0';
                p++;
            }
            temp.push_back(x);
        }
        x = 0;
        int f = 0;
        while (p < s.length()) {
            if (s[p] < '0' || s[p] > '9') {
                p++;
                if (f) {
                    from[x].push_back(temp);
                    f = 0;
                }
                continue;
            }
            f = 1;
            x = x * 10 + s[p] - '0';
            p++;
        }
        if (f) from[x].push_back(temp);
    }
    dfs(1);
    for (int i = 0; i < ans.size(); i++) {
        vector<int> p = ans[i];
        printf("%02d ", p[0]);
        for (int j = 1; j < p.size(); j++) {
            printf("+ %02d ", p[j]);
        }
        printf("-> %02d\n", b[i + 1]);
    }
    return 0;
}

 

posted @ 2020-12-05 19:14  HighLights  阅读(390)  评论(0)    收藏  举报