从文件中计算矩阵中的岛屿

标签 c breadth-first-search

所以我在解决我的 IT 考试问题时遇到了麻烦。 enter image description here

我解决了它,它部分起作用了,但我只能找到一个使用 BFS 的解决方案,我确信这不需要图遍历算法,因为我们还没有完成它们,但我找不到任何其他解决方案.有人能给我一个提示吗?我会将 BFS 代码发布到下面,以说明我实际上是如何解决这个问题的,而不是我认为应该如何解决的。

#include <stdio.h>
#include <stdlib.h>
char file[20][20];
int v[20], ns, n, comp, c[20];
int prim;
int ultim;
FILE *f;
int nr = 0, nl, nc;

void matrix() {
  int i, j;
  char c, n;
  fscanf(f, "%d %d \n", &nl, &nc);
  for (i = 1; i <= nl; i++) {
    for (j = 1; j <= nc; j++) {
      c = getc(f);
      file[i][j] = c;
    }
    n = getc(f);
  }
}
// citirea grafului din fisier text si construirea matricei de adiacenta

// afisarea pe ecran a matricei de adiacenta

void afisare() {
  int i, j;
  printf("Matricea  : \n");

  for (i = 1; i <= nl; i++)

  {
    for (j = 1; j <= nc; j++)

      printf("%c", file[i][j]);

    printf("\n");
  }
}

// returnează primului nod nevizitat

int exista_nod_nevizitat(int v[20], int n) {
  int i, j;
  for (i = 1; i <= nl; i++)

    if (v[i] == 0)

      return i; // primul nod nevizitat

  return 0; // nu mai exista noduri nevizitate
}

// parcurgerea în latime a unei componente conexe, plecând din nodul de start ns

void parcurgere_latime(char file[20][20], int nl, int ns) {
  int i, j;
  comp++;

  v[ns] = 1;

  prim = ultim = 1;

  c[ultim] = ns;

  while (prim <= ultim) {
    for (i = 1; i <= nl; i++)

      if (file[c[prim]][i] == 'L')

        if (v[i] == 0)

        {
          ultim++;

          c[ultim] = i;

          v[i] = 1;
        }

    prim++;
  }
}

// functia principala main()

int main() {
  int set, nr;
  f = fopen("in1.txt", "r");

  fscanf(f, "%d \n", &set);
  while (set != 0) {
    matrix();
    afisare();

    while (exista_nod_nevizitat(v, n) != 0) {
      ns = exista_nod_nevizitat(v, n);

      parcurgere_latime(file, n, ns); // parcurg o alta componenta conexa
    }

    printf("Graful este alcătuit din ");
    printf("%d", comp);
    printf("componente conexe \n");

    set--;
  }
  return 0;
}

最佳答案

找到了这个似乎更容易和更快的解决方案

int countIslands(char a[100][100])
{
    int count = 0;
    for ( i=0; i<nl; i++)
    {
        for (j=0; j<nc; j++)
        {
            if (a[i][j] == 'L')
            {
                if ((i == 0 || a[i-1][j] == '.') &&
                    (j == 0 || a[i][j-1] == '.'))
                    count++;
            }
        }
    }

    return count;
}

关于从文件中计算矩阵中的岛屿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52042507/

相关文章:

c - 如何避免文件系统的缓冲机制

c - 需要成像细节

algorithm - 为什么 BFS 的复杂度是 O(V+E) 而不是 O(V*E)?

c++ - 使用BFS算法查找未加权有向图中两个节点之间的所有最短路径

c++ - 查找给定根中的所有生成树

database - 用于无向图的Nosql DB?

c - 来自gcc : braces around scalar initializer, how to fix?的警告

c - 如何使用 swig 在 python 中使用 C 结构指针?

c - 获取C中嵌套数组的大小

queue - 不使用队列可以进行广度优先搜索或广度优先遍历吗?