讲解视频:可以在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存储了这个条件的验证结果。