请教一个高效算法!

guoyongzhen 2003-12-10 09:17:50
题目如下:
有一个方阵,大小不限,这个方阵由0和1组成。现在要求出此方阵中所有的零元素到所有的一元素的最短距离(距离即两点之间的距离),并把此最段距离保存到另外一个方阵中,输出到屏幕上。注意只计算0元素到1元素的距离,不计算1元素到0元素的距离,默认为0。
方阵用二维数组表示,两个元素之间的距离就用两个元素的坐标来计算(i*i+j*j=l*l)。
要求效率尽量高,因为N很大。

...全文
79 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
llwu 2003-12-12
  • 打赏
  • 举报
回复
找一个1,将它周围距离为1的未标记的0点距离标记为1
遍历所有的1
找一个1,将它周围距离为2的未标记的0点距离标记为2
遍历所有的1
找一个1,将它周围距离为3的未标记的0点距离标记为3
遍历所有的1
……
guoyongzhen 2003-12-12
  • 打赏
  • 举报
回复
楼上的算法什么意思啊?能否解释以下》?
短歌如风 2003-12-10
  • 打赏
  • 举报
回复
原方阵为S,输出方阵D,1元素对应的初始值设为0,0元素对应的初始值设为N*2。
遍历原矩阵,如果当前元素S[i,j]是1:
if i > 1 and D[i,j] + 1 < D[i-1,j] then
D[i-1,j] = D[i,j] + 1;
S[i-1,j] = 1;
end if
if i < N and D[i,j] + 1 < D[i+1,j] then
D[i+1,j] = D[i,j] + 1;
S[i+1,j] = 3;
end if
if j > 1 and D[i,j] + 1 < D[i,j-1] then
D[i,j-1] = D[i,j] + 1;
S[i,j-1] = 3;
end if
if j < N and D[i,j] + 1 < D[i,j+1] then
D[i,j+1] = D[i,j] + 1;
S[i,j+1] = 3;
end if
S[i,j] = 2;
把所有S中为3的元素设置为1。

重复上一步直到没有1元素。

如果在每次开始前先把所有的1元素位置读出来就不用把元素设为3了,可以直接设置为1。
如果用一个队列就更容易:
先把所有的1元素放到队列中;
while 队列非空 do
s[i,j]出队(从而得到i和j)
if i > 1 and D[i,j] + 1 < D[i-1,j] then
D[i-1,j] = D[i,j] + 1;
S[i-1,j] 入队;
end if
if i < N and D[i,j] + 1 < D[i+1,j] then
D[i+1,j] = D[i,j] + 1;
S[i+1,j] 入队;
end if
if j > 1 and D[i,j] + 1 < D[i,j-1] then
D[i,j-1] = D[i,j] + 1;
S[i,j-1] 入队;
end if
if j < N and D[i,j] + 1 < D[i,j+1] then
D[i,j+1] = D[i,j] + 1;
S[i,j+1]入队;
end if
end while
BlueSky2008 2003-12-10
  • 打赏
  • 举报
回复
平面点集间的最近点对,算法思想是分治。
guoyongzhen 2003-12-10
  • 打赏
  • 举报
回复
比如下面的矩阵:
0 0 0 0
1 0 0 0
0 0 0 1
1 1 1 1
则输出
1 2 5 4
0 1 4 1
1 1 1 0
0 0 0 0
boodweb 2003-12-10
  • 打赏
  • 举报
回复
每个0元素到每个1元素?存在另一个方正的哪儿?
听不懂,举个例子ok?

33,029

社区成员

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

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