MATLAB——解數獨


數獨

數獨是一種邏輯游戲,玩家需要根據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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM