• Remix
  • Share
  • New Entry

on 8 Nov 2023
  • 10
  • 34
  • 0
  • 1
  • 1950
clear all,drawframe(25);
Write your drawframe function below
function drawframe(f)
persistent data
if isempty(data)
%__matrix S initialized randomly___
S=zeros(9);
for m=1:16
x = randi(9,1,2);
val = setdiff(1:9,[S(x(1),:) S(:,x(2))']);
S(x(1),x(2))=val(randi(length(val)));
end
%____________________________________
G=[];
Sdue=[];
p=perms(1:9);
data.prems = find(S);
coop=[-2 -1;1 2;-1 1;];
cur=ones(1,9);
act=1;
solveSudo()
data.S = S;
end
drawNum(data,min(9,f-10))
function solveSudo(varargin)
G=getGroups;
G(2,:)=G(1,:);
if all(~cellfun(@isempty,G))
S(S==0)=nan;
Sdue=S;
while act<10
SetRaw
end
else
disp("!")
end
end
function G=getGroups
G=cell(1,9);
Sn=S;
Sn(Sn==0)=nan;
for i=1:9
A=p;
idx=find(S(i,:));
for j=1:length(idx)
A=A(A(:,idx(j))==S(i,idx(j)),:);
end
rig=1:9; rig(i)=[];
num=Sn(rig,:);
C=zeros(size(A,1),9,size(num,1));
for kk=1:size(num,1)
C(:,:,kk)=A~=num(kk,:);
end
idx=all(all(C,3),2);
A=A(idx,:);
B = Sn(i+coop(1+rem(i,3),:),:);
B=[ B(1:2,[2 3 1 5 6 4 8 9 7]);
B(1:2,[3 1 2 6 4 5 9 7 8])];
C=zeros(size(A,1),9,size(B,1));
for jj=1:size(B,1)
C(:,:,jj)= A~=B(jj,:) ;
end
idx = all(all(C,3),2);
A=A(idx,:);
G{i} = A;
end
end
function SetRaw
i = cur(act);
try
rr = G{2,act}(i,:);
S(act,:)=rr;
act = act+1;
cur(act)=1;
newG
catch
cur(act)=1;
S(act:end,:)=Sdue(act:end,:);
act = act-1;
cur(act)=cur(act)+1;
end
end
function newG
if act<10
A = G{1,act};
B=S(1:act-1,:);
C=zeros(size(A,1),9,size(B,1));
for j=1:size(B,1)
C(:,:,j)=A~=B(j,:);
end
idx=all(all(C,3),2);
A=A(idx,:);
switch rem(act,3)
case 2
B=S(act-1,:);
B=[B(1,[2 3 1 5 6 4 8 9 7]);
B(1,[3 1 2 6 4 5 9 7 8])];
C=zeros(size(A,1),9,size(B,1));
for j=1:size(B,1)
C(:,:,j) = A~=B(j,:);
end
idx = all(all(C,3),2);
A=A(idx,:);
case 0
B=S(act-[1 2],:);
B=[B(1:2,[2 3 1 5 6 4 8 9 7]);
B(1:2,[3 1 2 6 4 5 9 7 8])];
C=zeros(size(A,1),9,size(B,1));
for j=1:size(B,1)
C(:,:,j)=A~=B(j,:);
end
idx=all(all(C,3),2);
A=A(idx,:);
otherwise
end
G{2,act}=A;
end
end
end
function drawNum(data,f)
hold off
for ii=0:9
plot([0 9]+0.5,-[ii ii]-0.5,'-k','LineW',1+(~rem(ii,3)));
hold on
plot([ii ii]+0.5,-[0 9]-0.5,'-k','LineW',1+(~rem(ii,3)));
end
axis square
axis off
for i=1:81
[r,c]=ind2sub([9 9],i);
co = 'none';
if any(data.prems==i)
co='r';
elseif r <= f
co = 'k';
end
text(c,-r,""+data.S(i),'Color',co,'FontW','bold','hor','center');
end
drawnow
end
Animation
Remix Tree