在矩阵中查找正方形

时间:2013-12-14 00:16:51

标签: c algorithm matrix multidimensional-array

我无法想出一个算法来通过一个由零和一个矩阵组成的矩阵,例如看起来像这样:

3 5
1 0 1 1 1
0 0 1 0 1
0 0 1 1 1

前两位是行数和列数。零是空格,实际是“线”。我知道要通过矩阵,我需要使用两个嵌套循环:

for(int i = 0; i < rows; i++)
    for(int j = 0; j < cols; j++)
        /* code */

我需要能够将矩形的左上角坐标和右下角坐标保存在矩阵中。

我将矩阵保存在一维字段中,以及行数和列数。如果打印到屏幕上,这个特殊的矩阵看起来像这样:

1 0 1 1 1 0 0 1 0 1 0 0 1 1 1

我似乎找不到合适的算法来识别任何这种矩阵中的正方形。谁能给我一个提示?

1 个答案:

答案 0 :(得分:2)

简单算法:

for(int i = 0; i < rows-2; i++) // scan all but last 2 rows since we scan down once we find the top of a square
    // Reset the count after each row
    int count = 0;
    int lastCell = -1;
    for(int j = 0; j < cols; j++) { // Scan all columns
       // look for 3 cells in a row the same
       if (cells[i][j] == lastCell) {
          count++;
       } else {
          lastCell = cells[i][j];
          count=1;
       }
       if (count >= 3) {
          // Potential match found since we have a row of three the same
          // now check for the sides and bottom
          if (cells[i-2][j+1] == lastCell && cells[i-2][j+2] == lastCell && // left side
              cells[i][j+1] == lastCell && cells[i][j+2] == lastCell && // right side
              cells[i-1][j+2] == lastCell  // bottom
              ) {
                // Square detected - do whatever you like here :)
                // i, j is the top right corner of the detected square
           }
       }
    }

如果你需要方形是空心的,那么检查中心方块!= lastCell。

如果您只需要某个值的正方形,则只检查该值。