【问题标题】:Matrix Traversal in C/C++ [closed]C/C++ 中的矩阵遍历
【发布时间】:2015-07-02 16:38:46
【问题描述】:

我正在尝试解决这个问题:

给定一个由“1”(陆地)和“0”(水)组成的二维网格图,计算岛屿的数量。岛屿四面环水,由相邻陆地水平或垂直连接而成。您可以假设网格的所有四个边缘都被水包围。

示例 1:

11110
11010
11000
00000

我的解决办法是:

  #include <iostream>
#include <cstdlib>

#define N 5
#define M 4

using namespace std;

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

int counter = 0;


void dfs(int i, int j)
{
    a[i][j] = 0 ;
    if (i - 1 >= 0) dfs(i - 1, j);
    if (i + 1<M) dfs(i + 1, j);
    if (j - 1 >= 0) dfs(i, j - 1);
    if (j + 1<N) dfs(i, j + 1);
}

int main()
{
    int i = 0, j = 0;
    for (; i < M; i++)
    {
        for (j = 0; j < N; j++)
        {
            if (a[i][j] != 0) {
                dfs(i, j);
                counter++;
            }
        }
    }
    cout <<"No. Of Islands: "<<counter<< endl;
}

此解决方案在 Visua Studio 中显示异常。调用 dfs 函数时看不到哪里出错了。

【问题讨论】:

  • 没有问题。
  • a[5][4] --> a[4][5] ?还有i &lt; M.. j&lt;N (M:10, N:10)??
  • @iharob 请查看编辑。
  • @BLUEPIXY 你能解释一下吗。我完全糊涂了。
  • 这段代码无论如何都不会像你期望的那样,计数器最后总是等于M*N

标签: c++ algorithm matrix


【解决方案1】:

您需要 dfs 函数的结束条件。在函数开头添加这一行:

if (a[i][j]==0) return;

【讨论】:

    【解决方案2】:

    问题出在这一行

    cout <<"No. Of Islands: "+counter<< endl;
    

    "No. Of Islands: " 是一个字符串文字。向其中添加counter 是向const char * 添加偏移量,这不是您想要的。此外,如果counter 足够大(确实如此),它会尝试越界读取。应该是

    cout <<"No. Of Islands: " << counter << endl;
    

    这会将counter 流式传输到cout,后者会将其理解为int 并按原样输出。

    【讨论】:

      猜你喜欢
      • 2022-01-07
      • 2015-02-28
      • 2018-10-27
      • 1970-01-01
      • 2016-02-12
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 2018-02-16
      相关资源
      最近更新 更多