如何在2D矩阵中找到相同元素的线?

时间:2014-03-15 17:53:45

标签: java c++ c arrays matrix

我有自定义大小矩阵,应该找到指定长度的行。我需要这一行中第一个和最后一个元素的坐标 例如:
线长为3.
我的矩阵是

  • 0 0 0 1 0 0 1
  • 0 0 0 1 0 0 0
  • 0 0 0 1 0 0 0
  • 1 0 1 0 0 0 0

所以我的回答是[0,3],[2,3]。

如果行长为4 我的矩阵是

  • 0 0 0 0 1 0 0
  • 0 0 0 1 0 0 0
  • 1 0 1 0 0 0 0
  • 0 1 0 0 0 0 0

我的答案是[0,4],[3,1]。

元素可以包含任何类型(数字,字符,字符串,对象等) 我使用的编程语言并不重要,因为我只想了解算法 对不起,我的英语不好。谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

这不是您问题的确切解决方案,但它应足够接近,以便您能够转移它:

#include <stdio.h>
#include <stdbool.h>

#define WIDTH   8
#define HEIGHT  8

bool matrix[HEIGHT][WIDTH] =
{
    { 0, 0, 0, 1, 0, 0, 0, 1 },
    { 1, 0, 1, 0, 1, 0, 1, 1 },
    { 1, 1, 1, 0, 0, 1, 1, 1 },
    { 1, 1, 1, 1, 1, 0, 0, 0 },
    { 0, 1, 0, 0, 0, 0, 0, 0 },
    { 1, 0, 1, 1, 0, 0, 0, 0 },
    { 1, 1, 1, 1, 0, 0, 0, 0 },
    { 1, 1, 1, 1, 0, 0, 0, 0 },
};

struct position
{
    int row;
    int column;
};

enum direction { south, east, southwest, southeast };
char *dir_s[] = { "south", "east", "southwest", "southeast" };


int search(bool m[WIDTH][HEIGHT], struct position start, enum direction dir)
{
    switch (dir)
    {
        case east:
            if ((++start.column < WIDTH) && m[start.row][start.column])
            {
                return 1 + search(m, start, east);
            }
            break;

        case south:
            if ((++start.row < HEIGHT) && m[start.row][start.column])
            {
                return 1 + search(m, start, south);
            }
            break;

        case southwest:    
            if ((++start.row < HEIGHT) && (--start.column >= 0) && m[start.row][start.column])
            {
                return 1 + search(m, start, southwest);
            }
            break;

        case southeast:
            if ((++start.row < HEIGHT) && (++start.column < WIDTH) && m[start.row][start.column])
            {
                return 1 + search(m, start, southeast);
            }
    }
    return 0;
}


int main(int argc, char *argv[])
{
    struct position maxpos;
    enum direction maxdir;
    int length;
    int maxlength = 0;

    for (int column = 0; column < WIDTH; column++)
        for (int row = 0; row < HEIGHT; row++)
            if (matrix[row][column])
            {
                struct position pos = { row, column };
                enum direction dir;

                for (dir = south; dir <= southeast; dir++)
                {
                    length =  1 + search(matrix, pos, dir);
                    if (length > maxlength)
                    {
                        maxlength = length;
                        maxdir = dir;
                        maxpos = pos;
                    }
                }
            }
    printf("found max length %d on (%d,%d) in direction %s\n", maxlength, maxpos.row, maxpos.column, dir_s[maxdir]);
}

请注意,搜索会以递归方式调用,因此最好不要将其用于非常大的数据集。