#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
using namespace std;
bool check_path(int n, int k, vector<int>& current_path, int depth, int last_node, vector<int>& path_to_check) {
// end
if (depth == k) {
if (equal(current_path.begin(), current_path.end(), path_to_check.begin())) {
return true;
// break;
// return;
}
return false;
}
// start from each toy
if (depth == 0) {
for (int i = 0; i < n; i++) {
vector<int> next = current_path;
next[i]++;
if (check_path(n, k, next, depth + 1, i, path_to_check)) {
return true;
}
}
return false;
}
vector<int> next = current_path;
// left
if (last_node > 0 && current_path[last_node - 1] < k) {
next = current_path;
next[last_node - 1]++;
if (check_path(n, k, next, depth + 1, last_node - 1, path_to_check)) {
return true;
}
}
// right
if (last_node < n - 1 && current_path[last_node + 1] < k) {
next = current_path;
next[last_node + 1]++;
if (check_path(n, k, next, depth + 1, last_node + 1, path_to_check)) {
return true;
}
}
return false;
}
int main() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
vector<int> path_to_check(n);
for (int i = 0; i < n; i++) {
cin >> path_to_check[i];
}
int sum = accumulate(path_to_check.begin(), path_to_check.end(), 0);
vector<int> current_path(n, 0);
bool found = check_path(n, sum, current_path, 0, -1, path_to_check);
cout << (found ? "TAK" : "NIE") << endl;
}
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | #include <iostream> #include <vector> #include <algorithm> #include <numeric> using namespace std; bool check_path(int n, int k, vector<int>& current_path, int depth, int last_node, vector<int>& path_to_check) { // end if (depth == k) { if (equal(current_path.begin(), current_path.end(), path_to_check.begin())) { return true; // break; // return; } return false; } // start from each toy if (depth == 0) { for (int i = 0; i < n; i++) { vector<int> next = current_path; next[i]++; if (check_path(n, k, next, depth + 1, i, path_to_check)) { return true; } } return false; } vector<int> next = current_path; // left if (last_node > 0 && current_path[last_node - 1] < k) { next = current_path; next[last_node - 1]++; if (check_path(n, k, next, depth + 1, last_node - 1, path_to_check)) { return true; } } // right if (last_node < n - 1 && current_path[last_node + 1] < k) { next = current_path; next[last_node + 1]++; if (check_path(n, k, next, depth + 1, last_node + 1, path_to_check)) { return true; } } return false; } int main() { int t; cin >> t; while (t--) { int n; cin >> n; vector<int> path_to_check(n); for (int i = 0; i < n; i++) { cin >> path_to_check[i]; } int sum = accumulate(path_to_check.begin(), path_to_check.end(), 0); vector<int> current_path(n, 0); bool found = check_path(n, sum, current_path, 0, -1, path_to_check); cout << (found ? "TAK" : "NIE") << endl; } return 0; } |
English