实现数独:
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
是不是很酷炫。