• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

MATLAB——解数独

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

数独

数独是一种逻辑游戏,玩家需要根据9x9盘面的已知数字,推理出剩余所有空格的数字,并满足每一行、每一列和每个粗线宫(3x3)内均含1~9,不重复。

MATLAB中有关函数

M = dlmread(filename,delimiter) 使用指定的分隔符,将该文件的数据读取到矩阵M中,并将重复的分隔符视为单个的分隔符

disp(x) 显示变量x的值,而不打印变量名称

代码实现

文件目录

check3_by_3.m   
check_cell.m
check_col.m
check_row.m
data.txt
shudu.m
slove.m

check3_by_3.m

 1 function res = check3_by_3(matrix,i,j,num)
 2 %检查(i,j)能否放num
 3     res = true;
 4     block_row = floor((i - 1) / 3) + 1;
 5     block_col = floor((j - 1) / 3) + 1;
 6     
 7     block_row_to = block_row * 3;
 8     block_row_from = block_row_to - 2;
 9     block_col_to = block_col * 3;
10     block_col_from = block_col_to - 2;
11     
12     for row = block_row_from : block_row_to
13         for col = block_col_from : block_col_to
14             if matrix(row,col) == num
15                 res = false;
16                 break;
17             end
18         end
19     end
20 end
View Code

check_cell.m

1 function res = check_cell(matrix,i,j,num)
2 %按九宫格检查(i,j)能否放num
3     if check_row(matrix,i,j,num) && check_col(matrix,i,j,num) && check3_by_3(matrix,i,j,num)
4         res = true;
5     else
6         res = false;
7     end
8 end
View Code

check_col.m

 1 function res = check_col(matrix,i,j,num)
 2 %按列检查(i,j)能否放num
 3     res = true;
 4     for row = 1 : 9
 5         if matrix(row,j) == num
 6             res = false;
 7             break;
 8         end
 9     end
10 end
View Code

check_row.m

 1 function res = check_row(matrix,i,j,num)
 2 %按行检查(i,j)能否放num
 3     res = true;
 4     for col = 1 : 9
 5         if matrix(i,col) == num
 6             res = false;
 7             break;
 8         end
 9     end
10 end
View Code

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
View Code

shudu.m (主程序)

1 matrix = dlmread('data3.txt','');
2 disp(matrix);
3 solve(matrix,1);
View Code

slove.m

 1 function solve(matrix,id)
 2 %按编号逐一填充,递归
 3     if id > 81
 4         disp(matrix);
 5     else
 6         row = floor((id - 1) / 9) + 1;
 7         col = mod((id - 1),9) + 1;
 8     
 9         if matrix(row,col) ~= 0
10             solve(matrix,id + 1);
11         else
12             for i = 1 : 9
13                 if check_cell(matrix,row,col,i) == true
14                 matrix(row,col) = i;
15                 solve(matrix,id + 1);
16                 end
17             end
18         end
19    end
20 end
View Code

效果图

参考链接:https://youtu.be/La57P8wNnLA

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap