#include <algorithm> #include <iostream> #include <string> #include <vector> using namespace std; vector<int> find_paths(string s) { vector<int> paths; for (int i = 0; i != s.length(); i++) if (s[i] == '1') paths.push_back(i+1); return paths; } bool contains(vector<int>& safe_sectors, vector<int>& vec) { int i = 0; int j = 0; while (i != safe_sectors.size() && j != vec.size()) { if (safe_sectors[i] == vec[j]) j++; i++; } if (j == vec.size()) return true; return false; } vector<int> find_next_safe_sectors(vector<int>& act_safe, vector<vector<int> >& paths) { vector<int> ret; int len = paths.size(); for (int i = 0; i != len; i++) { if (contains(act_safe, paths[i])) ret.push_back(i+1); } return ret; } int main() { int n, b, r; string s; vector<int> init_rob; vector<vector<int> > sector_paths; vector<vector<int> > safe_sectors; cin >> n >> b >> r; sector_paths.resize(n); for (int i = 0; i != n; i++) { cin >> s; sector_paths[i] = find_paths(s); } init_rob.resize(r); for (int i = 0; i != r; i++) cin >> init_rob[i]; if (init_rob[r-1] <= b) { cout << 0 << endl; return 0; } safe_sectors.resize(n+2); for (int i = 0; i != b; i++) safe_sectors[0].push_back(i+1); for (int i = 1; i != n+2; i++) { safe_sectors[i] = find_next_safe_sectors(safe_sectors[i-1], sector_paths); if (safe_sectors[i].size() == 0) { cout << -1 << endl; return 0; } if (contains(safe_sectors[i], init_rob)) { cout << i << endl; return 0; } } cout << -1 << 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 75 76 77 78 79 80 81 | #include <algorithm> #include <iostream> #include <string> #include <vector> using namespace std; vector<int> find_paths(string s) { vector<int> paths; for (int i = 0; i != s.length(); i++) if (s[i] == '1') paths.push_back(i+1); return paths; } bool contains(vector<int>& safe_sectors, vector<int>& vec) { int i = 0; int j = 0; while (i != safe_sectors.size() && j != vec.size()) { if (safe_sectors[i] == vec[j]) j++; i++; } if (j == vec.size()) return true; return false; } vector<int> find_next_safe_sectors(vector<int>& act_safe, vector<vector<int> >& paths) { vector<int> ret; int len = paths.size(); for (int i = 0; i != len; i++) { if (contains(act_safe, paths[i])) ret.push_back(i+1); } return ret; } int main() { int n, b, r; string s; vector<int> init_rob; vector<vector<int> > sector_paths; vector<vector<int> > safe_sectors; cin >> n >> b >> r; sector_paths.resize(n); for (int i = 0; i != n; i++) { cin >> s; sector_paths[i] = find_paths(s); } init_rob.resize(r); for (int i = 0; i != r; i++) cin >> init_rob[i]; if (init_rob[r-1] <= b) { cout << 0 << endl; return 0; } safe_sectors.resize(n+2); for (int i = 0; i != b; i++) safe_sectors[0].push_back(i+1); for (int i = 1; i != n+2; i++) { safe_sectors[i] = find_next_safe_sectors(safe_sectors[i-1], sector_paths); if (safe_sectors[i].size() == 0) { cout << -1 << endl; return 0; } if (contains(safe_sectors[i], init_rob)) { cout << i << endl; return 0; } } cout << -1 << endl; return 0; } |