matlab程序解数独,Matlab解数独的小程序

function sudoku(jz)

%jz-要求解数独矩阵不确定得用0表示

clc

tic

global su a

su = jz;

a = zeros([9, 9, 9]);

sudoku1;

ind = (su==0);

f = sum(sum(ind>0));

%f-数独中不能确定数的个数

disp(f)

if (f < 1)

disp('Well done!')

disp('-----------------------SUDOKU--------------------------')

disp(su)

toc

save sudokoA su

return

end

if (f<15)

disp('Something wrong');

su

return

end

V = 0;

K = zeros(9,9,f);

if(f>15)

su1 = su;

a1 = a;

[r,c]=find(ind>0);

%数独矩阵中为0的坐标r纵坐标c横坐标

for i=1:length(r)

t = reshape(a1(r(i),c(i),:),[1,9]);

[r1,c1] = find(t>0);

for j = 1:length(r1)

a = a1;

su = su1;

su(r(i),c(i)) = t(c1(j));

sudoku1;

ind = (su==0);

f = sum(sum(ind>0));

if (f<1)

%                 disp('-----------------------SUDOKU--------------------------')

%                 disp(su)

%                 toc

%                 save sudokoA su

%   return

V = V + 1;

K(:,:,V) = su;

if ( V > 1)

for i=1:V-1

K1 = su - K(:,:,i);

if (sum(sum(abs(K1))) == 0)

K(:,:,V) = 0;

V = V - 1;

continue

end

end

end

end

end

end

end

if(V<1)

disp('Not found!')

return;

end

save K K

for i=1:V

disp(['The ',num2str(i),'-th solution:'])

disp('-----------------------SUDOKU--------------------------')

disp(reshape(K(:,:,i),[9,9]))

end

toc

%-------------------------------

function sudoku1

global su a

ind = (su==0);

for i= 1:9

a(:,:,i) = i*(1-ind);

end

f = sum(sum(sum(ind)));

f1 = f+1;

while(f1>f)

while( f1 > f)

f1 = f;

SUDO(ind);

ind = (su==0);

SUD(ind);

ind = (su==0);

f = sum(sum(ind));

end

if (f>0)

for i=0:2

for j=0:2

ind1 = zeros(9);

ind1(3*i+1:3*i+3, 3*j+1:3*j+3) = ind(3*i+1:3*i+3, 3*j+1:3*j+3);

[r3, c3] = find(ind1>0);

if (length(r3)>0)

Decide(r3,c3);

end

end

end

end

ind = (su==0);

f = sum(sum(ind));

end

%--------------------

function SUDO(ind)

global su a

[r,c] = find(ind > 0);

flag = 0;

for i=1:length(r)

y = FIND(r(i),c(i));

if (sum(y>0)==1)

flag = 1;

su(r(i),c(i)) = sum(y);

a(r(i), c(i),:) = 0;

a(r(i), :,sum(y)) = 0;

a(:, c(i),sum(y)) = 0;

else

a(r(i), c(i),:) = y;

end

end

%-------------------------

function SUD(ind)

global su a

for i =1:9

[r1,c1] = find(ind(i,:)>0);

r1 = r1*0+i;

Decide(r1,c1);

end

ind = (su==0);

for i=1:9

[r2,c2] = find(ind(:,i)>0);

c2 = c2*0 + i;

Decide(r2,c2);

end

%-------------------

function Decide(r,c)

global su a

s = [];

for i=1:length(r)

t = reshape(a(r(i),c(i),:),[1,9]);

s = [s; t];

end

for i=1:9

if (sum(sum((s==i))) == 1)

[t1,t2] = find((s-i)==0);

su(r(t1),c(t1)) = i;

a(r(t1),:,i) = 0;

a(:,c(t1),i) = 0;

a(r(t1),c(t1),:) = 0;

end

end

%--------------------

function y = FIND(i,j)

global su

y = 1:9;

m = ceil(i/3-0.1)-1;

n = ceil(j/3-0.1)-1;

xC = reshape(su(3*m+1:3*m+3, 3*n+1:3*n+3)',[1,9]);

y1 = sort([su(i,:), su(:,j)', xC]);

y2 = [1,y1(2:end) - y1(1:end-1)];

y1 = y1(y2~=0);

if (y1(1) == 0)

y1(1) = [];

end

y(y1) = 0;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值