洪水填充算法 - 房间面积

时间:2017-05-08 11:13:58

标签: c++ flood-fill dfs

有任务计算矩阵中的房间面积。第一个输入是行和列位置的坐标 - 零是自由空间,1 - 是墙。问题是泛洪填充功能给我堆栈溢出异常。

#include<iostream>
#include<conio.h>
using namespace std;

int a[5][5] = { {0,0,1,0,0},
                {0,0,1,0,0},
                {0,0,1,1,1},
                {1,1,1,0,0},
                {0,0,1,0,0},
};

bool vis[5][5] = { {0,0,0,0,0},
                  {0,0,0,0,0},
                  {0,0,0,0,0},
                  {0,0,0,0,0},
                  {0,0,0,0,0},
};
int c = 0;

void flood(int row, int col){
    if(row < 0 || row > 4 || col < 0 || col > 4)
        return;
    if(a[row][col] == 0 && !vis[row][col]){
        c++;
        vis[row][col] = 1;
    }
    flood(row-1, col);
    flood(row+1, col);
    flood(row,col-1);
    flood(row, col+1);
}

int main(){
    int row, column;
    cin>>row>>column;

    flood(row,column);
    cout<< c;

    getch();
return 0;
}

1 个答案:

答案 0 :(得分:2)

如果你遇到了你已经去过的地方,你就不应该递归。

在您的代码中,这意味着点击!vis[row][col]子句会阻止对flood的进一步递归调用。你可以通过在if内移动它们来实现这一点(或者可能更清楚一点,将所有东西移到外面并翻转条件)。当你碰壁时,这也会阻止递归的发生,但那你想要的。