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