将所有遥控车的位置作为状态,每次操作依次选择一辆遥控车向四个方向按题意模拟其前进的路线(注意,第一步后任意一辆车最多只有三个方向可以走)。
BFS 或深度限制 DFS 判断 k 步之内能否有一辆遥控车到达其中一个终点。
时间复杂度为 O((3R)^kmax(w, h))。
#include <iostream> #include <vector> #include <string> const int maxn = 12; const int maxr = 4; int w, h, k; std::vector<std::pair<int, int>> robots; std::string chess[maxn]; //上下左右 std::pair<int, int> next(std::pair<int, int> now, int dir) { if (dir == 0) { now.first--; } else if (dir == 1) { now.first++; } else if (dir == 2) { now.second--; } else { now.second++; } return now; } bool check(std::pair<int, int> now) { if (!(now.first >= 1 && now.first <= h && now.second >= 1 && now.second <= w)) { return false; } if (chess[now.first-1][now.second-1] == 'X') { return false; } for (auto it: robots) { if (it == now) { return false; } } return true; } bool arrival() { for (auto it: robots) { if (chess[it.first-1][it.second-1] == 'D') { return true; } } return false; } bool move(std::pair<int, int> &now, int dir) { std::pair<int, int> ori = now; while (check(next(now, dir))) { now = next(now, dir); } return (now != ori); } bool dfs(int steps) { // std::cerr << steps << " steps left. "; // for (auto it: robots) { // std::cerr << "(" << it.first << ", " << it.second << ")" << ' '; // } // std::cerr << '\n'; if (arrival()) { return true; } if (steps == 0) { return false; } std::vector<std::pair<int, int>> temp; for (int i = 0; i < robots.size(); i++) { for (int j = 0; j < 4; j++) { temp = robots; if (move(robots[i], j)) { if (dfs(steps-1)) { return true; } } robots = temp; temp.clear(); } } return false; } int main(int argc, char *argv[]) { std::ios::sync_with_stdio(false); std::cin.tie(0); std::cin >> w >> h >> k; for (int i = 0; i < h; i++) { std::cin >> chess[i]; } for (int i = 0; i < h; i++) { for (int j = 0; j < w; j++) { if (chess[i][j] == 'R') { robots.push_back(std::make_pair(i+1, j+1)); } } } std::cout << (dfs(k)?"YES\n":"NO\n"); }