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; }

浙公网安备 33010602011771号