matlab解数独游戏问题求解

img


B=[1,1,5;1,2,9;1,3,3;1,4,8;1,5,7;1,8,2;2,4,5;2,6,3;3,1,6;3,2,8;3,4,9;3,5,2;3,7,5;3,9,4;...
4,1,7;4,2,2;4,3,5;4,8,1;4,9,3;5,1,8;5,2,6;5,4,1;5,5,3;5,6,5;5,7,2;5,8,7;5,9,9;...
6,2,3;6,5,8;6,8,6;6,9,5;7,2,7;8,3,2;8,4,7;8,6,9;8,8,4;...
9,1,4;9,2,1;9,3,6;9,5,5;9,9,2];
drawSudoku(B);
x=optimvar('x',9,9,9,'Type','integer','LowerBound',0,'UpperBound',1);
sudpuzzle=optimproblem;
sudpuzzle.Objective=1;
sudpuzzle.Constraints.consx=sum(x,1)==1;
sudpuzzle.Constraints.consy=sum(x,2)==1;
sudpuzzle.Constraints.consz=sum(x,3)==1;
majorg=optimconstr(3,3,9);
for u=1:3
for v=1:3
arr=x(3*(u-1)+1:3*(u-1)+3,3*(v-1)+1:3*(v-1)+3,:);
majorg(u,v,:)=sum(sum(arr,1),2)==ones(1,1,9);
end
end
sudpuzzle.Constraints.majorg=majorg;
for u=1:size(B,1)
x.LowerBound(B(u,1),B(u,2),B(u,3))=1;
end
sudsoln=solve(sudpuzzle)
y=ones(size(sudsoln.x));
for k=2:9
y(:,:,k);
end
S=sudsoln.x.*y;
S=sum(S,3);
drawSudoku(S)
最后结果为什么是这样啊

img

将代码最后

for k=2:9
y(:,:,k);
end

更改为:

for k=2:9
y(:,:,k)=k;
end

即可