【#文档大全网# 导语】以下是®文档大全网的小编为您整理的《简单的数独游戏求解程序(matlab)》,欢迎阅读!
function S=sudoku(A)
%SUSOKU0 功能:求解数独 %调用格式:S=sudoku(A)
%A--需判断的数独矩阵(9×9),空格用0替代 %S--数独的解
%A=xlsread('sudoku.xls','A11:I19'); k=1; s=1;
A1=cell(9); C=cell(9); n0=0 %n0>2 A_ti=A;%原始题目 while 1
[d,p]=find_variable(A); C{p(1),p(2)}=d; n=length(d); if n>n0 n0=n end if n>1
k1(s)=9*(p(2)-1)+p(1); s=s+1;
A1{p(1),p(2)}=A; elseif n==0 s=s-1;
if A(k1(s))==C{k1(s)}(end) s=s-1; end
k=k1(s);%break A=A1{k};
A(k)=C{k}(2);%目前为止没有超过2个可选元素的 continue end
A(p(1),p(2))=C{p(1),p(2)}(1); k=k+1;
if sum(sum(ceil(A/9)))==81%判断是否填完了 break end
%if sum(sum(ceil(A/9)))==81 % break %end end S=A
%A=xlswrite('sudoku.xls',S,'k11:S19');
function [D,P]=find_variable(A)
%Find_variable 功能:找出数独矩阵中可填值最少的位置及可填值 %调用格式:[D,P]=find_variable(A)
%S--需判断的数独矩阵(9×9),空处用0替代 %D--可填的值
%P--可填值最少的位置,P中第1个元素为所在行,第2个元素为所在列 global C D=[1:9]; for k1=1:9 for k2=1:9
if A(k1,k2)~=0 %跳过已给数值 continue else
n1=ceil(k1/3); n2=ceil(k2/3);
m=A(3*n1-2:3*n1,3*n2-2:3*n2);
a=A(k1,:); %行 b=A(:,k2)'; %列 c=reshape(m',1,9); %宫
d0=setdiff(1:9,union(union(a,b),c)); %行列宫并集的补集,即可填数 if length(d0) %选出元素最少的 D=d0;P=[k1,k2]; %返回元素值及位置 end end end end
本文来源:https://www.wddqxz.cn/028d7996dd88d0d233d46a6d.html