1 /* 2 注意两点 3 1. 不可以使用替换可用节点为不可用节点的方法进行DFS 4 因为角落也可能有油,替换了就出不来。(某学长指导) 5 2. 可用通过开一个数组(例如我的b[][]数组) 6 用了存储到当前位置剩余最大油量 7 这样到话,下次若有更优解,则更新b 8 反之无需继续遍历 9 对于BFS,可用结构体记录坐标和到当前位置到剩余油量 10 用方法2剪枝即可 11 以下为DFS方法实现 12 */ 13 #include <cstring> 14 #include <iostream> 15 using namespace std; 16 int n, m, l; 17 char a[105][105]; 18 int b[105][105]; 19 int w[4][2] = {{0, 1}, {1, 0}, { -1, 0}, {0, -1}}; 20 bool ans; 21 void dfs(int x, int y, int s) 22 { 23 //cout << "x = " << x+1 << " y = " << y+1 << " s = " << s <<" a = " << a[x][y] << endl; 24 if (x == n - 1 && y == m - 1) {ans = true; return;} 25 if (b[x][y] >= s) return; 26 if (a[x][y] == ‘+‘) s = l; 27 if (s <= 0 || ans) return; 28 b[x][y] = s; 29 30 for (int i = 0; i < 4; ++i) 31 { 32 int nx = x + w[i][0], ny = y + w[i][1]; 33 if (nx >= 0 && ny >= 0 && nx < n && ny < m && a[nx][ny] != ‘#‘) 34 dfs(nx, ny, s-1); 35 } 36 } 37 int main() 38 { 39 int t; 40 cin >> t; 41 while (t--) 42 { 43 memset(b, -1, sizeof b); 44 cin >> n >> m >> l; 45 for (int i = 0; i < n; ++i) 46 cin >> a[i]; 47 ans = false; 48 dfs(0, 0, l); 49 if (ans) cout << "Yes" << endl; 50 else cout << "No" << endl; 51 } 52 return 0; 53 }
时间: 2024-12-19 16:29:53