1 条题解
-
0
#include #include #include #include #include #include
using namespace std;
int n; vector brightness; vector octagons; vector<vector> rotated; int min_sum = INT_MAX;
void backtrack(int pos, char req_color, int current_sum, const vector& perm, const vector& used) { if (pos == n) { if (req_color == rotated[perm[0]][0][6]) { if (current_sum < min_sum) { min_sum = current_sum; } } return; } int oct_idx = perm[pos]; for (const string& rot : rotated[oct_idx]) { if (rot[6] == req_color) { char new_req_color = rot[2]; int new_sum = current_sum + brightness[rot[2] - 'A']; if (new_sum < min_sum) { backtrack(pos + 1, new_req_color, new_sum, perm, used); } } } }
void solve() { while (true) { cin >> n; if (n == 0) break; brightness.resize(8); for (int i = 0; i < 8; ++i) { cin >> brightness[i]; } octagons.resize(n); for (int i = 0; i < n; ++i) { cin >> octagons[i]; }
rotated.clear(); rotated.resize(n); for (int i = 0; i < n; ++i) { string oct = octagons[i]; for (int j = 0; j < 8; ++j) { rotated[i].push_back(oct.substr(j) + oct.substr(0, j)); } } min_sum = INT_MAX; vector<int> perm(n); for (int i = 0; i < n; ++i) { perm[i] = i; } do { string first_oct = rotated[perm[0]][0]; char required_color = first_oct[2]; int current_sum = brightness[first_oct[6] - 'A']; vector<bool> used(n, false); used[perm[0]] = true; backtrack(1, required_color, current_sum, perm, used); } while (next_permutation(perm.begin(), perm.end())); if (min_sum != INT_MAX) { cout << min_sum << endl; } else { cout << "impossible" << endl; } }
}
int main() { solve(); return 0; }
- 1
信息
- ID
- 550
- 时间
- 3000ms
- 内存
- 64MiB
- 难度
- 10
- 标签
- 递交数
- 13
- 已通过
- 0
- 上传者