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 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| #include <iostream> #include <vector> #include <ostream> #include <sstream> #include <unordered_map> #include <algorithm> #include <cmath> #include <queue> #include <unordered_set> #include <stack> using namespace std;
bool DFS(int i, int j, int N, int k, const std::string &word, vector<vector<int>> &path, vector<vector<bool>> &visited, vector<vector<char>> &data) { if (i < 0 || i >= N || j < 0 || j >= N || visited[i][j] || word[k] != data[i][j]) { return false; } path.push_back({i, j}); visited[i][j] = true; if (k == word.size() - 1) { return true; } vector<vector<int>> directions = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};
for (auto &dir : directions) { int newI = i + dir[0]; int newJ = j + dir[1]; if (DFS(newI, newJ, N, k + 1, word, path, visited, data)) { return true; } }
path.pop_back(); visited[i][j] = false; return false; }
string findString(const std::string &word, vector<vector<char>> &data, int N) { vector<vector<int>> path; std::string result; vector<vector<bool>> visited(N, vector<bool>(N, false)); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (data[i][j] == word[0]) { bool found = DFS(i, j, N, 0, word, path, visited, data); if (found) { for (auto &itVec : path) { result += to_string(itVec[0]) + "," + to_string(itVec[1]) + ","; } result.pop_back(); return result; } } } } return "N"; }
int main() {
int N; cin >> N; cin.ignore();
vector<vector<char>> data(N, vector<char>(N)); for (int i = 0; i < N; i++) { std::string line; getline(cin, line); std::istringstream iss(line); std::string str; int j = 0; while (getline(iss, str, ',')) { data[i][j] = str[0]; j++; } }
std::string word; getline(cin, word);
cout << findString(word, data, N) << endl;
return 0; }
|