matlab 两两分组,使用MATLAB根据位置对这些进行分组?

在过去尝试解决类似的问题时(主要是为了解决某些逻辑谜题),我总是发现最简单的方法是保留一堆你仍然需要查看的点,然后逐个处理它们直到堆栈为空。

groups = []

while any_points_left(A):

group = []

stack = [pick_random_point(A)]

while not_empty(stack):

p = stack.pop()

group.append(p)

mark_as_done(p)

for q in all_points_in_same_row_or_column(p):

stack.append(q)

groups.append(group)

翻译成Matlab(这不是这种代码的理想语言):

groups = {};

while nnz(A) > 0 % any points left?

% find random point

[i, j] = ind2sub(size(A), find(A, 1, 'first'));

stack = {[i, j]};

group = {};

while ~isempty(stack)

p = stack{end}; stack = stack(1:end-1); % pop point from stack

i = p(1); j = p(2);

if A(i, j) == 0 % check if point is not already removed

continue

end

A(i, j) = 0; % mark as done

group{end+1} = p; % add to group

for ii = 1:size(A, 1) % check same column

if A(ii, j) == 1

stack{end+1} = [ii, j]; % add to stack

end

end

for jj = 1:size(A, 2) % check same row

if A(i, jj) == 1

stack{end+1} = [i, jj]; % add to stack

end

end

end

groups{end+1} = group;

end

% print result

for ig = 1:length(groups)

fprintf('Group %i: ', ig)

group = groups{ig};

for ip = 1:length(group)

fprintf('(%i, %i) ', group{ip}(1), group{ip}(2))

end

fprintf('\n')

end

应该可以以清晰为代价将此代码编写得更紧凑。结果:

Group 1: (1, 1) (1, 4) (4, 4) (3, 4) (2, 1)

Group 2: (5, 2) (5, 3)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值