数独-缺失填补[9*9](MATLAB)

实现数独:

1 链接数独怎么玩

在这里插入图片描述

2 编程思想
  9宫格中每个值可以取值的范围在(1~9)中,从data矩阵的data[1,1]坐标开始,按列进行迭代,直到data[9,9]格点结束。
3 算法步骤
   Step1: 首先将格点调入到:模块判断一、模块判断二、模块判断三中进行判断;当格点的值在模块中时,返回0;否则返回1。
   Step2: 将各返回值相乘,如果乘积value=1,进行下一步,否则返回Step1。
   Step3: 当遍历到最后格点data[9,9]时,算法结束。

(一)模块判断一:每行

传入参数: 矩阵data、格点坐标、待填补的格点值。
判断过程: 传入的值a会与整行中所有元素判断,若该填补的元素a本身存在于本行中,则返回0,否则返回1。

进行判断程序为:

function out_put= RowTest(data,x,y,a)
if find(data(x,:)==a) % 行索引判断
    out_put=0;
else
    out_put=1;
end
end
(二)模块判断二:每列

传入参数: 矩阵data、格点坐标、待填补的格点值。
判断过程: 传入的值a会与整列中所有元素判断,若该填补的元素a本身存在于此列中,则返回0,否则返回1。

进行判断程序为:

function out_put = LineTest(data,x,y,a)
if find(data(:,y)==a) % 列索引判断
    out_put=0;
else
    out_put=1;
end
end
(三)模块判断三:每个【3*3】宫

传入参数: 矩阵data、格点坐标、待填补的格点值。
判断过程: 传入的值a会与宫[3*3]中所有元素判断,若该填补的元素a本身存在于宫中,则返回0,否则返回1。

进行判断程序为:

function out_put= HouseTest(data,x,y,a)
x_Start = floor((x-1)/3)*3+1; % 行开始
x_End = ceil(x/3)*3; % 行结束
y_Start = floor((y-1)/3)*3+1; % 列开始
y_End = ceil(y/3)*3; % 列结束
if find(data(x_Start:x_End,y_Start:y_End)==a)
    out_put=0;
else
    out_put=1;
end
end
(四)数独用例测试

完整程序:

% 主程序 main_test.m

clc,clear
% 数据在此输入
% data就是要求的数独矩阵,未知数用0表示
data = [
0 0 3 0 0 0 1 0 0
1 0 0 4 0 0 0 0 0
0 0 0 2 0 0 0 0 0
0 0 0 0 0 0 0 5 0
0 0 7 0 3 6 0 0 0
0 0 0 0 0 0 0 4 2
2 0 0 0 0 0 0 0 0
0 0 0 0 7 0 9 0 0
5 8 0 0 1 0 0 0 0
];
Test(data,1);


% 脚本 test.m 
function Test(data,i)
[Row,Line] = size(data);
%锁定A矩阵的坐标(x,y);
y=ceil(i/Row);
x=i-(y-1)*Row;
if i>Row*Line
   data % 输出数独
else
if data(i)~=0
   Test(data,i+1);
else
     for a=1:Row
     %判断是否每行,每列是否相同的。
     Judge= RowTest(data,x,y,a) * LineTest(data,x,y,a) * HouseTest(data,x,y,a);
         if Judge==1
             data(i)=a;
             Test(data,i+1);
         else
         end
     end
end
end


% 脚本 RowTest.m
function out_put= RowTest(data,x,y,a)
if find(data(x,:)==a) % 行索引判断
    out_put=0;
else
    out_put=1;
end
end

% 脚本 LineTest.m
function out_put = LineTest(data,x,y,a)
if find(data(:,y)==a) % 列索引判断
    out_put=0;
else
    out_put=1;
end
end


% 脚本 HouseTest.m
function out_put= HouseTest(A,x,y,a)
x_Start = floor((x-1)/3)*3+1; % 行开始
x_End = ceil(x/3)*3; % 行结束
y_Start = floor((y-1)/3)*3+1; % 列开始
y_End = ceil(y/3)*3; % 列结束
if find(A(x_Start:x_End,y_Start:y_End)==a)
    out_put=0;
else
    out_put=1;
end
end

验证结果:

data =

     6     4     3     7     5     8     1     2     9
     1     9     2     4     6     3     5     8     7
     7     5     8     2     9     1     4     3     6
     8     6     1     9     2     4     7     5     3
     4     2     7     5     3     6     8     9     1
     9     3     5     1     8     7     6     4     2
     2     7     9     6     4     5     3     1     8
     3     1     4     8     7     2     9     6     5
     5     8     6     3     1     9     2     7     4
     

是不是很酷炫。

  • 13
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值