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";
}
答案 0 :(得分:0)
该问题可以被认为是具有连接相邻的单元(节点)的边缘的图,即共享边界。
使用堆栈结构实现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);
for(i,j)= {( - 1,0),(0,1),(1,0),(0,-1)}。结果,当时的程序状态字(变量,指令指针等)
调用dfs(x + 1, y)
,将其隐式推送到程序使用的堆栈内存中。这些调用导致与(x,y)相邻的单元数增加1.
递归展开的时候
if( used[x][y] >= 3 || x < 1 || y < 1 || x > a || y > b )
满足条件导致返回坐标(节点),调用dfs on(x,y)或所有调用
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)等时,所以递归就到了;