请教算法高手:如何在矩阵中,移动一个矢量的有效算法?

风里有梦 2005-10-16 06:11:29

一个 4 x 4 矩阵定义如下:

aRectangle[] = {{0, 0, 1, 1},
{0, 0, 1, 0},
{0, 1, 1, 0},
{0, 0, 0, 0}
}

如上矩阵中,内中为1的为图形,为0的背景空间,假如我想将图形移到最左边?最有效的算法是……?请看我的方案,但是我认为分成两步太慢了,能不能一个循环搞定它并且最快的?

------------------------------------------------------

// 移到原点坐标 x
for ( i = 0; i < 4; i++ )
{
for ( j = 0; j < 4; j++ )
if ( aRectangle[j][i] )
goto xFIANL;

for ( j = 0; j < 4; j++ )
{
for ( k = 0 ; k < 4 - 1; k++ )
aRectangle[j][k] = aRectangle[j][k + 1];

aRectangle[j][4 - 1] = 0;
}
i--;
}
xFIANL:

// 移到原点坐标 y
for ( i = 0; i < 4; i++ )
{
for ( j = 0; j < 4; j++ )
if ( aRectangle[i][j] )
goto yFIANL;

for ( j = 0; j < 4; j++ )
{
for ( k = 0 ; k < 4 - 1; k++ )
aRectangle[k][j] = aRectangle[k + 1][j];

aRectangle[4 - 1][j] = 0;
}
i--;
}
yFIANL:
-----------------------------------------------------------------
...全文
100 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhang_jiang 2005-10-17
  • 打赏
  • 举报
回复
使用另外一个变量记录最左边和图形的距离:
int dis = 0;

// 确定dis的值, 也就是最左边和图形最右边的距离
int i,j;
for(i = 0; i < 4; i++)// 每一列
{
for(j = 0; j < 4; j++)// 每一行
{
if(aRectangle[j][i]) dis = i;
}
}

// 输出移动到最左边的情形
for(i = 0; i < 4; i++)
{
for(j = 0; j < 4; j++)
{
printf("%i ", aRectangle[i][(j+dis)%4]);
}
printf("\n");
}
风里有梦 2005-10-17
  • 打赏
  • 举报
回复
zhang_jiang的方法和我的一样。是我说错了,呵呵!我是说移到左上。left & top most.

所以就有了分成两步的(X和Y)。

不过你的第一步漏掉了当扫描到左边距离后,没有立刻跳出循环,导致结果永远是3。

修改后是:

#include <stdio.h>

int main( int argc, char* argv[] )
{
int dis = 0;
BYTE aRectangle[4][4] = {{0,0,1,0},
{0,1,1,1},
{0,1,0,1},
{0,0,0,0}};

// 确定dis的值, 也就是最左边和图形最右边的距离
int i,j;

for(i = 0; i < 4; i++)// 每一列
{
for(j = 0; j < 4; j++)// 每一行
{
if( aRectangle[j][i] )
{
dis = i;
goto SCAN_FINAL;
}
}
}

SCAN_FINAL:
printf("%i\n", dis);

// 输出移动到最左边的情形
for(i = 0; i < 4; i++)
{
for(j = 0; j < 4; j++)
{
printf("%i ", aRectangle[i][(j+dis)%4]);
}
printf("\n");
}

return (0);
}

难道说就没有更快的算法了吗?请大家指教。:(

还有 galois_godel说改变数据结构,如何改?
galois_godel 2005-10-17
  • 打赏
  • 举报
回复
要么改变数据结构
否则,从复杂度角度来说,下限是O(n^2)

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧