求算法! 一个二维数组 int num[250][300] 表示250列,300行。这中间有二个矩形值是1,其余是0;求一算法找出二个矩形的左上角下标,及高宽。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 没有考虑重叠的情况,你可进一步改进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]; 找右下角的地方写错了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]; 关于播放图片特效的问题 richedit里面显示了一张图片,缩放会触发什么消息 类似屏幕键盘的无焦点窗口是怎么做出来的? 如何按下属性页CPropertyPage的OnOk后不关闭属性页 谁能推荐基本C++的经典书 求助:程控交换机的计费软件 请各位前辈指教:DirectShow SDK中有支持数据的网络传输部分的吗?支持多播吗? 打印出两份(急)? 快来帮助,再线等待,高分相送 小问题 为什么看别书上源代码的时候感觉那个功能很简但自己实践地时候嫩是做不出来怎么办? 很奇怪的问题 GetExitCodeThread 确定线程已经退出 线程还没实际退出 会出现内存泄露
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];
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];