因为数据很小,我们都意识到了暴力搜索,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;
} 
京公网安备 11010502036488号