Проблемы с матрицей 8x5 не решить

Я только изучаю Матрицу и алгоритм. я складываю на один вопрос, который я еще не мог решить. Вопрос в том,

матрица, состоящая из целых значений

#[0 0 0 2 2]
#|1 1 7 2 2|
#|2 2 7 2 1|
#|2 1 7 4 4|
#|2 7 7 4 4|
#|4 6 6 0 4|
#|4 4 6 4 4|
#[4 4 6 4 4]  

Область определяется, когда несколько одинаковых значений соединены вместе (по горизонтали или по вертикали). Например, с помощью приведенной выше матрицы мы можем найти следующие области

#[0 0 0 * *]
#|* * * * *|
#|* * * * *|
#|* * * * *|
#|* * * * *|
#|* * * * *|
#|* * * * *|
#[* * * * *]

#[* * * 2 2]
#|* * * 2 2|
#|* * * 2 *|
#|* * * * *|
#|* * * * *|
#|* * * * *|
#|* * * * *|
#[* * * * *]

#[* * * * *]
#|1 1 * * *|
#|* * * * *|
#|* * * * *|
#|* * * * *|
#|* * * * *|
#|* * * * *|
#[* * * * *]

Проблема заключается в реализации функции "Найти количество элементов самой большой области", которая находит самую большую область (область, состоящую из наибольшего количества элементов) и возвращает количество элементов из этой области. Например, в приведенной выше матрице самая большая площадь:

#[* * * * *]
#|* * * * *|
#|* * * * *|
#|* * * 4 4|
#|* * * 4 4|
#|* * * * 4|
#|* * * 4 4|
#[* * * 4 4]

Итак, функция вернет 9 (область состоит из 9 элементов).

Любая помощь, пожалуйста, по этому вопросу, как мне решить? лучший способ ?

Спасибо..


person includee666    schedule 22.02.2013    source источник
comment
На самом деле я должен реализовать функцию и вернуть 9 (область состоит из 9 элементов)   -  person includee666    schedule 23.02.2013
comment
Пожалуйста, несколько примеров для объяснения ниже вопросов!   -  person includee666    schedule 23.02.2013


Ответы (1)


ХОРОШО! Я не мог удержаться от того, чтобы сделать твою домашнюю работу...

В следующем коде C# используется рекурсивная функция для подсчета всех непосещенных соседей данной ячейки матрицы. Основная программа перебирает все строки и столбцы, чтобы найти ячейку с наибольшим количеством соседей с идентичным содержимым.

namespace akArrayCluster
{
    class Program
    {
        static void Main(string[] args)
        {
            int[,] a = new int[,] 
            {
                {0, 0, 0, 2, 2},
                {1, 1, 7, 2, 2},
                {2, 2, 7, 2, 1},
                {2, 1, 7, 4, 4},
                {2, 7, 7, 4, 4},
                {4, 6, 6, 0, 4},
                {4, 4, 6, 4, 4},
                {4, 4, 6, 4, 4}
            };
            int row;
            int col;
            int res = getBiggestArea(a, out row, out col);

            o("");
            o("Biggest area has " + res + " cells");
            o("Top-left cell is [" + row + ";" + col + "]");
        }

        static int getBiggestArea(int[,] a, out int row, out int col)
        {
            int opt = 0;
            int cnt;
            int rows = a.GetLength(0);
            int cols = a.GetLength(1);
            bool[,] visited = new bool[rows, cols];

            row = col = -1;

            for (int r = 0; r < rows; r++)
                for (int c = 0; c < cols; c++)
                {
                    setAllToFalse(visited, rows, cols);

                    cnt = getNeighbourCount(a[r, c], a, visited, r, c);
                    if (cnt > opt)
                    {
                        opt = cnt;
                        row = r;
                        col = c;
                    }
                }

            setAllToFalse(visited, rows, cols);   //  edited col --> cols
            getNeighbourCount(a[row, col], a, visited, row, col);
            showSolution(a, visited, rows, cols);

            return opt;
        }

        static void setAllToFalse(bool[,] v, int rows, int cols)
        {            
            for (int row = 0; row < rows; row++)
                for (int col = 0; col < cols; col++)
                    v[row, col] = false;
        }

        static void showSolution(int[,] a, bool[,] visited, int rows, int cols)
        {
            string s;

            o("");
            for (int row = 0; row < rows; row++)
            {
                s = "";
                for (int col = 0; col < cols; col++)
                {
                    s += " " + (visited[row, col] ? a[row, col].ToString() : ".");
                }

                o(s);
            }
        }

        static int getNeighbourCount(int ca, int[,] a, bool[,] visited, 
                                     int row, int col)
        {
            int nc = 0;
            int rows = a.GetLength(0);
            int cols = a.GetLength(1);

            if ((row >= 0) && (row < rows) && 
                (col >= 0) && (col < cols) && 
                (ca == a[row, col]) && !visited[row, col])
            {
                visited[row, col] = true;

                nc = 1
                    + getNeighbourCount(ca, a, visited, row, col - 1)
                    + getNeighbourCount(ca, a, visited, row - 1, col)
                    + getNeighbourCount(ca, a, visited, row, col + 1)
                    + getNeighbourCount(ca, a, visited, row + 1, col);
            }

            return nc;
        }

        static void o(string s)
        {
            System.Console.WriteLine(s);
        }
    }
}

Результат запуска программы:

 . . . . .
 . . . . .
 . . . . .
 . . . 4 4
 . . . 4 4
 . . . . 4
 . . . 4 4
 . . . 4 4

Biggest area has 9 cells
Top-left cell is [3;3]

Второй пример (см. комментарий ниже):

 . 2 2 2 2
 2 2 2 2 2
 . . . 2 2
 . . . . 2

Biggest area has 12 cells
Top-left cell is [0;1]
person Axel Kemper    schedule 23.02.2013
comment
Большое спасибо, мистер Аксель, это очень хороший пример для меня, поэтому я буду учиться на нем. - person includee666; 24.02.2013
comment
Пожалуйста! Пожалуйста, нажмите кнопку «Принять», чтобы вознаградить мои усилия. - person Axel Kemper; 24.02.2013
comment
Ой извините не увидел :) - person includee666; 24.02.2013
comment
А как насчет количества элементов самых больших прямоугольных площадей, мистер Аксель? какую область я должен изменить на функцию? Спасибо еще раз. - person includee666; 24.02.2013
comment
например эта матрица, [0 2 2 2 2] |2 2 2 2 2| |4 5 6 2 2| |0 9 8 7 2| - person includee666; 24.02.2013
comment
Ошибка в вызове setAllToFalse(). Я исправил это в исходном сообщении. Результат равен 12. Это отвечает на ваш вопрос? - person Axel Kemper; 24.02.2013
comment
Оу, да, я вижу, и я изменил его cols на cols, спасибо. ой, нет, мой второй вопрос: теперь мне нужно найти самую большую прямоугольную область в матрице :) Таким образом, алгоритм должен вернуть 8 (количество элементов самых больших прямоугольных областей) - person includee666; 24.02.2013
comment
в порядке. Хорошая возможность для вас показать, что вы узнали из первой задачи ;-) - person Axel Kemper; 24.02.2013
comment
Я пробовал код выше, но я получаю результат 22, а не 8, и я не могу отображать строки и столбцы, как вы. это более сложный алгоритм. Пожалуйста, не могли бы вы проверить мистера Акселя. Благодарю. - person includee666; 25.02.2013
comment
Чтобы получить самый большой прямоугольник: просканируйте строки и столбцы, как в моем решении. Для каждой (строки; столбца) ширина сканирования = 1,2,... макс и для каждой ширины сканирования высота = 1,2... макс. Итак, вы можете найти самый большой прямоугольник без рекурсии. Это просто поиск в четырех вложенных циклах. - person Axel Kemper; 25.02.2013