【问题标题】:depth first search recursion in matrix矩阵中的深度优先搜索递归
【发布时间】:2017-01-08 15:28:06
【问题描述】:

http://codeforces.com/contest/540/problem/C

使用矩阵上的深度优先递归解决了这个问题,我得到了这个问题的代码。谁能解释为什么/在哪里递归在这个矩阵上起作用?

#include <bits/stdc++.h>
using namespace std;
int a, b, used[600][600];
char c;
void dfs( int x, int y )
{
    used[x][y]++;
    if( used[x][y] >= 3 || x < 1 || y < 1 || x > a || y > b )
        return;
    dfs(x + 1, y);
    dfs(x - 1, y);
    dfs(x, y + 1);
    dfs(x, y - 1);
}
int main()
{
    int i, j;
    cin >> a >> b;
    for( i = 1; i <= a; i++ ){
        for( j = 1; j <= b; j++ ){
            cin >> c;
            if( c == '.' )    used[i][j] = 1;
            else used[i][j] = 2;
         }
     } 
     int x1, y1, x2, y2;
     cin >> x1 >> y1 >> x2 >> y2;
     used[x1][y1] = 1;
     dfs(x1, y1);
     if( used[x2][y2] >= 3 )    cout << "YES";
     else cout << "NO";
} 

【问题讨论】:

    标签: depth-first-search


    【解决方案1】:

    这个问题可以被认为是一个图,其边连接相邻的单元(节点),即共享一个边界。

    当使用堆栈结构实现 DFS 时,更容易看到递归。这里递归是以函数调用的形式实现的。我们只会为以下节点调用 dfs:

    directly reachable from the current node we are examining(which are all the cells 
    adjacent to (x, y)).
    

    致电 dfs(x, y); 导致调用 dfs(x + i, y + j); 对于 (i, j) = {(-1, 0), (0, 1), (1, 0), (0, -1)}。结果,当时的程序状态字(变量,指令指针等) dfs(x + 1, y) 被调用,被隐式推送到程序使用的堆栈内存中。这些调用导致与 (x, y) 相邻的单元格计数增加 1。

    递归在何时展开 if( used[x][y] &gt;= 3 || x &lt; 1 || y &lt; 1 || x &gt; a || y &gt; b )

    满足条件导致返回坐标(节点),它在 (x, y) 上调用 dfs 或当所有调用 dfs(x + i, y + j) for (i, j) = {(-1, 0), (0, 1), (1, 0), (0, -1)} 已将控制权返回给 dfs(x, y) 即之后行dfs(x, y - 1)

    所以当您在 dfs(x, y) 中调用 dfs(x -1, y)、dfs(x, y -1) 等时,递归无处不在;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      相关资源
      最近更新 更多