zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Python冒泡排序(4)
    Python冒泡排序(3)
    Python3默认递归最大深度是998
    Python利用递归函数和列表推导式实现快速排序
    天池比赛的文章--欢迎大家交流
    caffe学习笔记1
    网络压缩系列1:低秩逼近
    yolov1
    Windows下用Caffe跑自己的数据(遥感影像)
    基于灰度共生矩阵的纹理提取
  • 原文地址:https://www.cnblogs.com/lfri/p/9739294.html
Copyright © 2011-2022 走看看