HOJ3237----BFS/DFS

 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 }

 

posted @ 2017-08-01 22:18  Posase  阅读(101)  评论(0编辑  收藏  举报