Пример кода:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Practice
{
class Program
{
static void Main()
{
var matrix = new[] { new StringBuilder("00000"), new StringBuilder("02301"), new StringBuilder("08507"), new StringBuilder("70004") };
var clusters = 0;
for (var i = 0; i < matrix.Length; i++)
for (var j = 0; j < (matrix.Any() ? matrix[i].Length : 0); j++)
if (matrix[i][j] != '0')
{
Console.Write("Cluster {0}: <", ++clusters);
var cluster = new List<char>();
Traverse(matrix, i, j, ref cluster);
Console.WriteLine("{0}>", string.Join(",", cluster));
}
Console.ReadKey();
}
private static void Traverse(StringBuilder[] matrix, int row, int col, ref List<char> cluster)
{
cluster.Add(matrix[row][col]);
matrix[row][col] = '0';
for (var i = -1; i <= 1 && row + i >= 0 && row + i < matrix.Length; i++)
for (var j = -1; j <= 1 && col + j >= 0 && col + j < (matrix.Any() ? matrix[row + i].Length : 0); j++)
if(matrix[row + i][col + j] != '0')
Traverse(matrix, row + i, col + j, ref cluster);
}
}
}
Объяснение алгоритма:
- Для каждой строки:
- Для каждого столбца в этой строке:
- Если не посещенный ненулевой элемент:
- Сохранить найденный элемент кластера;
- Пометить местоположение в [строке, столбце] как посещенное;
- Проверить, не посещен ли- ноль соседей при нахождении в пределах матрицы:
- [строка-1, столбец-1];
- [строка-1, столбец];
- [строка- 1, столбец + 1];
- [строка, столбец - 1];
- [строка, столбец + 1];
- [строка + 1, столбец - 1];
- [строка + 1, столбец];
- [строка + 1, столбец + 1].
- Если какой-либо сосед не посещенотличные от нуля, повторяйте шаги 1-4 до тех пор, пока все соседи не посетят нули (все члены кластера были найдены).