在行中找到相同的值& 2D数组的列

时间:2014-11-17 15:17:11

标签: arrays matlab sudoku

大家好我想在matlab中解决sodoku难题。我的问题是我应该在每一行,每一列和每一个3 * 3子数组中找到相同的值。

我们的2d数组为9 * 9,随机填充值1-9。

我写这个是为了在行中找到相同的值,但我不知道我应该如何为列和3 * 3子数组执行此操作。

conflict_row = 0;

for i=1:9
    temp = 0;
    for j=1:9
       if (temp==A(i,j))
           conflict_row = conflict_row+1;
       end
       temp = A(i,j);
    end
end

抱歉,我是新手。

3 个答案:

答案 0 :(得分:4)

  1. 查找所有列中的值:

    v = find(all(any(bsxfun(@eq, A, permute(1:size(A,1), [3 1 2])),1),2));
    
  2. 查找所有行中的值:

    v = find(all(any(bsxfun(@eq, A, permute(1:size(A,2), [3 1 2])),2),1));
    
  3. 查找所有3x3块中存在的值:按照A. Donda的this answer重新整形矩阵,将每个块转换为3D切片;然后将每个块重新整形为一列;并申请1:

    m = 3; %// columns per block
    n = 3; %// rows per block
    B = permute(reshape(permute(reshape(A, size(A, 1), n, []), [2 1 3]), n, m, []), [2 1 3]);
    B = reshape(B,m*n,[]);
    v = find(all(any(bsxfun(@eq, B, permute(1:size(B,1), [3 1 2])),1),2));
    

答案 1 :(得分:2)

可能不是最快的解决方案,但为什么不做它的功能,一次用于行,一次用于列

[conflict_row ] = get_conflict(A)
    for i=1:9
        temp = 0;
        for j=1:9
           if (temp==A(i,j))
               conflict_row = conflict_row+1;
           end
           temp = A(i,j);
        end
    end

然后你叫它两次

conflict_row = get_conflict(A);  % Rows

转置A获取列

将列转换为行并使用与之前相同的代码

 conflict_col = get_conflict(A.');  

答案 2 :(得分:-1)

如果你想在同一列中工作,那么你应该做这样的事情(也很抱歉这是在C#我不知道你在用什么语言):

int currentCol = 0;

foreach (var item in myMultiArray)
{
    int currentColValue = item[currentCol];
}

这是有效的,因为myArray是一个数组数组,因此只需允许foreach执行行迭代就可以轻松选择特定列,只需选择列即可您需要currentCol值。