H-小黑屋的救赎_浙江机电职业技术学院第八届新生亮相赛(同步赛) (nowcoder.com)
非常经典的一道广搜题
#include <iostream>
#include <string>
#include <stack>
#include <vector>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <cstdlib>
#include <cstring>
#include <cmath>
#define ll long long
using namespace std;
typedef pair<int, int> PII;
char arr[15][15];
int n, m, p, k, si, sj;
int dir[4][2] = { {0, -1}, {0, 1}, {1, 0}, {-1, 0} };
int main() {
cin >> n >> m >> p >> k;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
cin >> arr[i][j];
if (arr[i][j] == 's') {
si = i, sj = j;
}
}
}
vector<vector<int>> st(n + 10, vector<int>(n + 10, 0));
queue<vector<int>> q;
q.push({ si, sj, p, k });
st[si][sj] = 1;
while (!q.empty()) {
int size = q.size();
while (size--) {
vector<int> v = q.front();
q.pop();
int x = v[0], y = v[1], p = v[2], k = v[3];
for (int i = 0; i < 4; i++) {
int xx = x + dir[i][0];
int yy = y + dir[i][1];
if (xx < 1 || xx > n || yy < 1 || yy > m || st[xx][yy]) continue;
if (arr[xx][yy] == 'w') continue;
if (arr[xx][yy] == 'e' && p > 0) return cout << "YES", 0;
if (arr[xx][yy] == 'd' && p > 1 && k > 0) {
q.push({ xx, yy, p - 1, k - 1 });
}
else if (arr[xx][yy] == 'r' && p > 1) {
q.push({ xx, yy, p - 1, k });
}
st[xx][yy] = 1;
}
}
}
cout << "NO";
return 0;
}