京东笔试,算法岗第二题解答
#include<vector> #include<iostream> #include<string> using namespace std; void makeroute(vector<string>& str, int n, int m, int i, int j) { if (i < 0 || i >= n || j < 0 || j >= m) return; if (str[i][j]!='1'&&str[i][j] != '#') { str[i][j] = '1'; makeroute(str, n, m, i - 1, j); makeroute(str, n, m, i + 1, j); makeroute(str, n, m, i, j - 1); makeroute(str, n, m, i, j + 1); } } bool canbreak(vector<string>& str, int n, int m) { int si, sj; for (int i = 0;i < n;i++) { for (int j = 0;j < m;j++) { if (str[i][j] == 'S') { si = i; sj = j; break; } } } vector<string> ss; for (int t = 0;t < 3;t++) { for (int i = 0;i < n;i++){ string tmp = str[i] + str[i] + str[i]; ss.push_back(tmp); } } makeroute(ss, 3*n, 3*m, n+si, m+sj); for (int i = 0;i < 3 * n;i++) if (ss[i][0] == '1' || ss[i][3 * m - 1] == '1') return true; for (int j = 0;j < 3 * m;j++) if (ss[0][j] == '1' || ss[3 * n - 1][j] == '1') return true; return false; } int main() { int t; cin >> t; vector<string> res; for (int i = 0;i < t;i++) { int n, m; cin >> n >> m; vector<string> str(n); for (int i = 0;i < n;i++) cin >> str[i]; if (canbreak(str, n, m)) res.push_back("Yes"); else res.push_back("No"); } for (int i = 0;i < t;i++) cout << res[i] << endl; return 0; }数组复制了九份,从中间的'S'往外找连通点,如果最后能通到边界,就是能成功,AC
#京东##笔试题目#