Matrix 8x5问题无法解决

时间:2013-02-22 17:30:10

标签: matrix implementation calculated-columns

我正在学习矩阵和算法。我堆叠在一个我无法解决的问题上。问题是,

由整数值组成的矩阵

#[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个元素组成)。

任何有关此问题的帮助我如何解决?最好的方式?

谢谢..

1 个答案:

答案 0 :(得分:0)

OK!我忍不住做你的作业......

以下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]