大家好我想在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
抱歉,我是新手。
答案 0 :(得分:4)
查找所有列中的值:
v = find(all(any(bsxfun(@eq, A, permute(1:size(A,1), [3 1 2])),1),2));
查找所有行中的值:
v = find(all(any(bsxfun(@eq, A, permute(1:size(A,2), [3 1 2])),2),1));
查找所有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
值。