一个二维数组  int num[250][300] 表示250列,300行。
这中间有二个矩形值是1,其余是0;
求一算法找出二个矩形的左上角下标,及高宽。

解决方案 »

  1.   

    没有考虑重叠的情况,你可进一步改进
    typedef _GRID_INFO_
    {
    int iRow[2]; // 左上角和右下角行数
    int iCol[2]; // 左上角和右下角列数
    int iHigh;
    int iWidth;
    } GI, * pGI;int giGrid[250][300];
    int giZeroRow[300];
    GI gi[2];
    int iRow, iCol, iStep;memset(gi, 0, sizeof(gi));
    memset(giZeroRow, 0, sizeof(giZeroRow));
    iStep = 0;
    for (iRow = 1; iRow < 250; iRow++)
    {
    if (memcmp(giZeroRow, giGrid[iRow], sizeof(giZeroRow))) // 此行包含1
    {
    for (iCol = 0; iCol < 300; iCol++)
    {
    if (giGrid[iRow][iCol])
    {
    if (iStep == 0) // 正在寻找第一个矩形的左上角
    {
    gi[0].iRow[0] = iRow;
    gi[0].iCol[0] = iCol;
    iStep = 1;
    }
    else
    if (iStep == 1) // 正在寻找第一个矩形的右下角
    {
    gi[0].iRow[1] = iRow;
    gi[0].iCol[1] = iCol;
    if (memcmp(giGrid[iRow], giGrid[iRow + 1], sizeof(giGrid[iRow])))
    iStep = 2;
    }
    else
    if (iStep == 2) // 正在寻找第二个矩形的左上角
    {
    gi[1].iRow[0] = iRow;
    gi[1].iCol[0] = iCol;
    iStep = 3;
    }
    else
    if (iStep == 3) // 正在寻找第二个矩形的右下角
    {
    gi[1].iRow[1] = iRow;
    gi[1].iCol[1] = iCol;
    if (iRow == 249 || memcmp(giGrid[iRow], giGrid[iRow + 1], sizeof(giGrid[iRow])))
    {
    iStep = 4;
    break;
    }
    }
    }
    }
    if (iStep == 4)
    break;
    }
    }gi[0].iHigh = gi[0].iRow[1] - gi[0].iRow[0];
    gi[0].iWidth = gi[0].iCol[1] - gi[0].iCol[0];
    gi[1].iHigh = gi[1].iRow[1] - gi[1].iRow[0];
    gi[1].iWidth = gi[1].iCol[1] - gi[1].iCol[0];
      

  2.   

    找右下角的地方写错了
    typedef _GRID_INFO_
    {
    int iRow[2]; // 左上角和右下角行数
    int iCol[2]; // 左上角和右下角列数
    int iHigh;
    int iWidth;
    } GI, * pGI;int giGrid[250][300];
    int giZeroRow[300];
    GI gi[2];
    int iRow, iCol, iStep;memset(gi, 0, sizeof(gi));
    memset(giZeroRow, 0, sizeof(giZeroRow));
    iStep = 0;
    for (iRow = 1; iRow < 250; iRow++)
    {
    if (memcmp(giZeroRow, giGrid[iRow], sizeof(giZeroRow))) // 此行包含1
    {
    for (iCol = 0; iCol < 300; iCol++)
    {
    if (giGrid[iRow][iCol])
    {
    if (iStep == 0) // 正在寻找第一个矩形的左上角
    {
    gi[0].iRow[0] = iRow;
    gi[0].iCol[0] = iCol;
    iStep = 1;
    }
    else
    if (iStep == 1) // 正在寻找第一个矩形的右下角
    {
    if(iCol == 299 || giGrid[iRow][iCol + 1] == 0)
    {
    gi[0].iRow[1] = iRow;
    gi[0].iCol[1] = iCol;
    if (memcmp(giGrid[iRow], giGrid[iRow + 1], sizeof(giGrid[iRow])))
    iStep = 2;
    }
    }
    else
    if (iStep == 2) // 正在寻找第二个矩形的左上角
    {
    gi[1].iRow[0] = iRow;
    gi[1].iCol[0] = iCol;
    iStep = 3;
    }
    else
    if (iStep == 3) // 正在寻找第二个矩形的右下角
    {
    if(iCol == 299 || giGrid[iRow][iCol + 1] == 0)
    {
    gi[1].iRow[1] = iRow;
    gi[1].iCol[1] = iCol;
    if (iRow == 249 || memcmp(giGrid[iRow], giGrid[iRow + 1], sizeof(giGrid[iRow])))
    {
    iStep = 4;
    break;
    }
    }
    }
    }
    }
    if (iStep == 4)
    break;
    }
    }gi[0].iHigh = gi[0].iRow[1] - gi[0].iRow[0];
    gi[0].iWidth = gi[0].iCol[1] - gi[0].iCol[0];
    gi[1].iHigh = gi[1].iRow[1] - gi[1].iRow[0];
    gi[1].iWidth = gi[1].iCol[1] - gi[1].iCol[0];