常用取整函数
1.floor(x):向下取整
2.ceil(x):向上取整
3.round(x):取最接近的整数
4.fix(x):向0取
整体思路
For me,想要写出一个这样的解题代码,好难!没有一个整体的解题思路,可能真的写不出来……
总体思路就是,一步一步解,先解决小问题,再解决大问题,再整合起来一起解
解数独比较重要的两点有:
思维::逆向思维、拆解思维
方法::递归法
具体地:
1.可以取哪些值?通过不能取哪些值来确定
2.不能取哪些值怎么确定?行不能的+列不能的+小方格中不能的
3.某格是否需要求解?需要一条路径,不需要又一条路径,遍历所有的格子最终求得唯一解
具体操作
注意:脚本or函数,命名尽量方便自己记忆和理解
建立数独矩阵
编辑器中输入待解数独阵,需要填数的值先写为0,各数中间有空格,命名为data.txt
5 3 0 0 7 0 0 0 0
6 0 0 1 9 5 0 0 0
0 9 8 0 0 0 0 6 0
8 0 0 0 6 0 0 0 3
4 0 0 8 0 3 0 0 1
7 0 0 0 2 0 0 0 6
0 6 0 0 0 0 2 8 0
0 0 0 4 1 9 0 0 5
0 0 0 0 8 0 0 7 9
新建一个脚本,命名为shudu,写入如下所示代码,表示读data.txt中的值,将其保存到matrix中。dlmread(‘data.txt’,’’)中后面两个单引号表示遇到空格读取下一个数:
matrix=dlmread(‘data.txt’,’’);
disp(matrix);
注意:shudu.m脚本中之后输入的任何内容均不删除,运行对应内容时,只需要将其注释即可。
判断行
下图表示检查每一行可以/不可以的取值,命名为chcek_row:
shudu.m脚本中继续写入如下,来测试是否能达到目的。
for num=1:9
result=chcek_row(matrix,1,3,num);
disp([num,result]);
end
结果如下,表示第一行第三列这个空格中不能填入3、5、7(因为同行已经存在):
1 1
2 1
3 0
4 1
5 0
6 1
7 0
8 1
9 1
判断列
类似地,排除同列不能填入的数过程如下(函数命名为check_col):
shudu.m脚本中继续写入如下,来测试是否能达到目的。
for num=1:9
result=check_col(matrix,1,3,num);
disp([num,result]);
end
判断3×3方格
注意:对应大小行列的转换算式要自己找规律,总结列出
先将大行大列与小行小列对应(函数命名为check_3_by_3):
shudu.m中继续写入如下,来判断对应是否正确(i/j范围均为1-9):
i=input(‘i=’);
j=input(‘j=’);
block_row=floor((i-1)/3)+1;
block_col=floor((j-1)/3)+1;
disp([block_row,block_col])
再排除3×3block中不能填入的数:
shudu.m中继续写入如下来判断:
for num=1:9
result=check_3_by_3(matrix,1,3,num);
disp([num,result]);
end
整体判断
判断行、列、block约束下能/不能取的值:
shudu.m中继续写入如下,来测试是否正确:
for num=1:9
result=check_cell(matrix,1,3,num);
disp([num,result]);
end
求解
函数命名为solve.m最后在shudu.m中写入如下内容,表示从81个格子的第一个格子开始测试求解:
solve(matrix,1)