因为数据很小,我们都意识到了暴力搜索,DFS可以更简单地解决。

这题的主要难点在于编码难度,我在写这道题的时候认为每搜索一次重新开辟一个二维数组太蠢,又没想清楚如何动态管理车辆的位置信息,其实不需要管理车辆信息,每次重新搜索就可以了。

详细注释:

#include <bits/stdc++.h>
using namespace std;
const int N = 15;
const int inf = 0x3f3f3f3f;
char mp[N][N];
int dx[] = {0, 0, -1, 1};//合起来分别对应上下左右
int dy[] = {1, -1, 0, 0};
int flag, n, m, k;
bool check(int x, int y) {  //找合法位置,在区域内且不可遇到障碍物
    return x >= 1 && x <= n && y >= 1 && y <= m && mp[x][y] != 'R' &&
           mp[x][y] != 'X';
}
void dfs(int cnt) {
    if (cnt >= k) return;
    if (flag) return;
    for (int i = 1; i <= n; i++)  //这样搜索就不用管理坐标了
        for (int j = 1; j <= m; j++)
            if (mp[i][j] == 'R')               //枚举每一辆车
                for (int k = 0; k < 4; k++) {  //枚举每一个方向
                    int tx = i, ty = j;
                    while (check(tx + dx[k], ty + dy[k]))
                        tx += dx[k], ty += dy[k];     //不断向前
                    if (mp[tx][ty] == 'D') flag = 1;  //如果抵达 设为完成
                    swap(mp[tx][ty], mp[i][j]);       //换过去
                    dfs(cnt + 1);                     //向下搜索
                    swap(mp[tx][ty], mp[i][j]);       //换回来
                }
}
int main() {
    cin >> m >> n >> k;
    for (int i = 1; i <= n; i++) scanf("%s", mp[i] + 1);
    dfs(0);
    puts(flag ? "YES" : "NO");
    return 0;
}

改了一下我比赛的时候写的

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
char s[15][15];
bool finish = 0;
int w, h, ti, a, b;
void turnright(int x, int y) {
    int i;
    for (i = y + 1; i <= w; ++i)
        if (s[x][i] != '.' && s[x][i] != 'D') break;
    if (s[x][i - 1] == 'D') finish = 1;
    a = x, b = i - 1;
}
void turnleft(int x, int y) {
    int i;
    for (i = y - 1; i > 0; --i)
        if (s[x][i] != '.' && s[x][i] != 'D') break;
    if (s[x][i + 1] == 'D') finish = 1;
    a = x, b = i + 1;
}
void turndown(int x, int y) {
    int i;
    for (i = x + 1; i <= h; ++i)
        if (s[i][y] != '.' && s[i][y] != 'D') break;
    if (s[i - 1][y] == 'D') finish = 1;
    a = i - 1, b = y;
}
void turnup(int x, int y) {
    int i;
    for (i = x - 1; i; --i)
        if (s[i][y] != '.' && s[i][y] != 'D') break;
    if (s[i + 1][y] == 'D') finish = 1;
    a = i + 1, b = y;
}
void dfs(int times) {
    if (finish) return;
    if (times > ti) return;
    for (int i = 1; i <= h; ++i)
        for (int j = 1; j <= w; ++j)
            if (s[i][j] == 'R') {
                int xi, yi;
                turnup(i, j), swap(s[i][j], s[a][b]), xi = a, yi = b;
                dfs(times + 1), swap(s[i][j], s[xi][yi]);
                if (finish) return;
                turndown(i, j), swap(s[i][j], s[a][b]), xi = a, yi = b;
                dfs(times + 1), swap(s[i][j], s[xi][yi]);
                if (finish) return;
                turnleft(i, j), swap(s[i][j], s[a][b]), xi = a, yi = b;
                dfs(times + 1), swap(s[i][j], s[xi][yi]);
                if (finish) return;
                turnright(i, j), swap(s[i][j], s[a][b]), xi = a, yi = b;
                dfs(times + 1), swap(s[i][j], s[xi][yi]);
                if (finish) return;
            }
}
int main() {
    scanf("%d%d%d", &w, &h, &ti);
    for (int i = 1; i <= h; ++i) scanf("%s", s[i] + 1);
    dfs(1);
    puts(finish ? "YES" : "NO");
    return 0;
}