将所有遥控车的位置作为状态,每次操作依次选择一辆遥控车向四个方向按题意模拟其前进的路线(注意,第一步后任意一辆车最多只有三个方向可以走)。
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");
}
京公网安备 11010502036488号