Matlab 练习
该blog记录了我做“基于枚举搜索算法的数独问题求解”习题时对课程组给的代码的梳理
This blog is incomplete, and might be revoked soon.
使用到的变量
Order
数独游戏阶数,在init_data中初始化,在此次练习题目中赋值为6
cur_mark
三维数组,下标分别表示行坐标,列坐标,数项 ,在init_data中初始化,初始值为6x6x6
内容全部为1的数组
diff_mark
四维数组。记录搜索过程中关键步骤的标注变化,在发生回退搜索操作时需要这些记录来恢复标注场景。第四维下标,对应记录发生时正在开始处理的格子编号。前三维下标分别对应行坐标、列坐标、数项
groups
三维数组,用于指定哪几格属于一宫。下标分别表示行坐标,列坐标,宫。在init_data中初始化,初始值为6x2x6
内容全部为0的数组
例如在输入下列代码后
1
2
groups=zeros(Order,2,6);
groups(:,:,1)=[1 1; 1 2; 1 3; 2 1; 2 2; 2 3];
groups
中内容变为:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
val(:,:,1) =
1 1
1 2
1 3
2 1
2 2
2 3
val(:,:,2) =
1 4
1 5
1 6
2 4
2 5
2 6
val(:,:,3) =
3 1
3 2
3 3
4 1
4 2
4 3
val(:,:,4) =
3 4
3 5
3 6
4 4
4 5
4 6
val(:,:,5) =
5 1
5 2
5 3
6 1
6 2
6 3
val(:,:,6) =
5 4
5 5
5 6
6 4
6 5
6 6
init_digit
题目最初已给的数字,下标分别表示行坐标,列坐标,格中数字。在本题中已给出:
则
1
2
3
4
5
6
7
8
9
10
11
12
13
14
init_digit=[
1 1 4;
1 6 1;
2 3 2;
2 4 3;
3 2 5;
3 5 3;
4 2 6;
4 5 4;
5 3 5;
5 4 4;
6 1 1;
6 6 5
];
cell
当前正在处理的格子的编号
cell_record_ptr
ptrs
一维数组。记录每格中指针所对位置。
cell_record
cell_record_ptr
xcell
ycell
goto_nextcell
next_mark
output
check_mark函数返回值,0代表某一格可填数字全为0,则此路不通,1代表可通
使用到的函数
check_mark
待检查的 mark 表格,当发现某一格子的所有数项的 mark 均为零,说明此路行不通,输出返回值零
返回output
mark指某一格中可填数字
refresh_mark
定义
当指定格子选定数项后,依据数独游戏规则对全图标注进行修改,并返回修改结果。
实现代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function next_mark = refresh_mark(groups,cur_mark,x,y,ptr)
% MARKING 输入参数含义:组的定义,cur_mark,行坐标,列坐标,数项
% 当行、列坐标指定的格子内填写数项 ptr 后,对 mark 表格进行更新
Order=size(cur_mark,1);
next_mark =cur_mark;
next_mark(x,y,:)=0; % 同一格各项 mark 清零
next_mark(x,:,ptr)=0; % 同一行同项 mark 清零
next_mark(:,y,ptr)=0; % 同一列同项 mark 清零
% 同一组的同项 mark 清零
for g=1:size(groups,3)
found=0;
for i=1:Order
if groups(i,:,g)==[x,y]
found=1;
end
end
if found==1
for i=1:Order
next_mark(groups(i,1,g),groups(i,2,g),ptr)=0;
end
end
end
next_mark(x,y,ptr)=1;
end
使用到的.m文件
go
顶层程序
init_data
用于初始化变量,初始化的变量cur_mark,diff_mark,ptrs,groups,init_digit,cell_record,cell_record_ptr
oneround
一轮处理。按照既定算法步骤,对当前格进行处理, 根据处理情况决定前进一格还是回退一格。
print_mark
print_result
This post is licensed under CC BY 4.0 by the author.