MATLAB练习题:验证数独是否满足特定的规则

  讲解视频:可以在bilibili搜索“MATLAB教程新手入门篇——数学建模清风主讲”。

MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili


数独是一个9×9的方阵,它由九个宫格构成,每个宫格又由九个小格子构成(图中用颜色区分开的3×3的方阵)。请验证下面这个数独的盘面是否满足以下三点要求:

(1)每列包含1到9的不重复数字;(2)每行包含1到9的不重复数字;(3)每个宫格内包含1到9的不重复数字。

sd = [1 9 4 3 8 5 7 2 6;
      8 3 2 7 6 9 4 5 1;
      6 5 7 4 2 1 9 3 8;
      2 6 9 8 3 7 5 1 4;
      5 8 3 1 9 4 6 7 2;
      4 7 1 2 5 6 3 8 9;
      9 1 5 6 7 2 8 4 3;
      3 2 6 5 4 8 1 9 7;
      7 4 8 9 1 3 2 6 5];
% 每列是否为1到9的不重复数
Condition_1 = all(all(sort(sd,1) == (1:9)'))
% 每行是否为1到9的不重复数
Condition_2 = all(all(sort(sd,2) == 1:9))
% 每个九宫格是否为1到9的不重复数
cc = mat2cell(sd,[3,3,3],[3,3,3]);
Condition_3 = true;
for ii = 1:9
    tmp = cc{ii}; % 第ii个宫格对应的3×3的方阵
    if ~all(sort(tmp(:)) == (1:9)')
        Condition_3 = false;
        break
    end
end
Condition_3

代码的思路如下:

验证每列的数字:首先,我们检查每列是否包含1到9的不重复数字。sort(sd,1)表示沿着行方向对sd的每一列进行排序,如果每一列排序后都是1到9的序列,sort(sd,1) == (1:9)'就会返回一个9行9列全为逻辑值1的方阵,此时使用两次all函数可以得到Condition_1为true。

验证每行的数字:其次,我们检查每行是否包含1到9的不重复数字。这类似于列的验证,但方向不同。我们使用sort(sd,2) 沿着列方向对sd的每一行进行排序,如果每一行排序后都是1到9的序列,那么Condition_2就为true。

验证每个宫格的数字:最复杂的部分就是检查每个宫格。这里mat2cell函数发挥了重要作用。我们使用mat2cell(sd,[3,3,3],[3,3,3])将数独方阵分割成九个宫格,每个宫格都是3×3的方阵,并存储在元胞数组cc中。然后,我们使用循环遍历这九个宫格,检查每个宫格是否包含1到9的不重复数字。Condition_3存储了这个条件的验证结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值