首发于 今日事
【数独】按要求为5*5的方格填写数字

【数独】按要求为5*5的方格填写数字

Matlab案例----【5*5数独 】解题源代码

在群里,关注到一道小学数学题。题目要求如下:

请在方格中填入数字1~5,使得每行每列都包含每个数字一次,且每个⭕中的数等于它周围4哥方格中的最大数字与最小数字之差。

思路都能猜到,用排除法。但这道题,还是让大多数人,感到束手无策。

本着程序解决一切的思路,本文用程序来实现。

先给出结果

用结果说话

第一个版本:

完完全全的暴力穷举。

在这里就不展示第一个版本程序的内容了,直接上github查看。

效果就是,跑了15小时,还只跑了1/5^10。明显,算法不够优化。

第二个版本:

Middle Loop 中性循环

% MiddleLoop
% author: ruogu7
% email: 380545156@qq.com
% date: 07/01/2020
% latest update: 07/02/2020
% link: https://zhuanlan.zhihu.com/p/152489404

clear all; clc;
%% 初始条件
existing_num = [ 0 0 2 0 0;
    0 0 0 0 0;
    0 4 0 0 0;
    0 0 0 0 0;
    0 0 0 2 0;];
% potential_answer = [ 1 3 2 4 5;
%     3 5 1 4 2;
%     2 4 3 3 1;
%     5 2 4 1 3;
%     4 1 3 2 5;]
matrix_4_4 = [ 4 4 2 2 ;
    4 2 3 4;
    2 3 4 4;
    2 4 4 4;];
fullset = [1 2 3 4 5 ];

%% 结果文件
k = datetime;
kkk_file = [num2str(k.Year),'-',num2str(k.Month),'-',num2str(k.Day),'-',num2str(k.Hour),'-',num2str(k.Minute),'-result.txt']
%% 结果文件
% 已填数据集合

% for r_l_num = 1:25
%     rr = 1 + floor((r_l_num-1)/5)
%     ll = mod(r_l_num, 5)
%     if ll == 0
%         ll = 5
%     end
% end

%% 中型迭代
% (1,1)
v_1_1_set = unique([existing_num(1,:),existing_num(:,1)'])
v_1_1_set_avai = setdiff(fullset,v_1_1_set)
for ii_1_1 = v_1_1_set_avai
    % 取得先前的干净数据
    v_existing_num_1 = existing_num;
    % 更新已有数据
    v_existing_num_1(1,1) = ii_1_1
    
    % (1,2)
    v_1_2_set = unique([v_existing_num_1(1,:),v_existing_num_1(:,2)']);
    v_1_2_set_avai = setdiff(fullset,v_1_2_set)
    for ii_1_2 = v_1_2_set_avai
        % 取得先前的干净数据
        v_existing_num_2 = v_existing_num_1;
        % 更新已有数据
        v_existing_num_2(1,2) = ii_1_2
        
        % (1,3)
        % 数据已经有了,不用做改变
        % (1,4)
        v_1_4_set = unique([v_existing_num_2(1,:),v_existing_num_2(:,4)']);
        v_1_4_set_avai = setdiff(fullset,v_1_4_set)
        for ii_1_4 = v_1_4_set_avai
            % 取得先前的干净数据
            v_existing_num_4 = v_existing_num_2;
            % 更新已有数据
            v_existing_num_4(1,4) = ii_1_4
            
            % (1,5)
            v_1_5_set = unique([v_existing_num_4(1,:),v_existing_num_4(:,5)']);
            v_1_5_set_avai = setdiff(fullset,v_1_5_set)
            for ii_1_5 = v_1_5_set_avai
                % 取得先前的干净数据
                v_existing_num_5 = v_existing_num_4;
                % 更新已有数据
                v_existing_num_5(1,5) = ii_1_5
                
                % (2,1)
                v_2_1_set = unique([v_existing_num_5(2,:),v_existing_num_5(:,1)']);
                v_2_1_set_avai = setdiff(fullset,v_2_1_set)
                for ii_2_1 = v_2_1_set_avai
                    % 取得先前的干净数据
                    v_existing_num_6 = v_existing_num_5;
                    % 更新已有数据
                    v_existing_num_6(2,1) = ii_2_1
                    
                    % (2,2)
                    v_2_2_set = unique([v_existing_num_6(2,:),v_existing_num_6(:,2)']);
                    v_2_2_set_avai = setdiff(fullset,v_2_2_set)
                    for ii_2_2 = v_2_2_set_avai %
                        % 取得先前的干净数据
                        v_existing_num_7 = v_existing_num_6;
                        % 更新已有数据
                        v_existing_num_7(2,2) = ii_2_2
                        
                        % (2,3)
                        v_2_3_set = unique([v_existing_num_7(2,:),v_existing_num_7(:,3)']);
                        v_2_3_set_avai = setdiff(fullset,v_2_3_set)
                        for ii_2_3 = v_2_3_set_avai
                            % 取得先前的干净数据
                            v_existing_num_8 = v_existing_num_7;
                            % 更新已有数据
                            v_existing_num_8(2,3) = ii_2_3
                            
                            % (2,4)
                            v_2_4_set = unique([v_existing_num_8(2,:),v_existing_num_8(:,4)']);
                            v_2_4_set_avai = setdiff(fullset,v_2_4_set)
                            
                            for ii_2_4 = v_2_4_set_avai
                                % 取得先前的干净数据
                                v_existing_num_9 = v_existing_num_8;
                                % 更新已有数据
                                v_existing_num_9(2,4) = ii_2_4
                                
                                % (2,5)
                                v_2_5_set = unique([v_existing_num_9(2,:),v_existing_num_9(:,5)']);
                                v_2_5_set_avai = setdiff(fullset,v_2_5_set)
                                
                                for ii_2_5 = v_2_5_set_avai
                                    % 取得先前的干净数据
                                    v_existing_num_10 = v_existing_num_9;
                                    % 更新已有数据
                                    v_existing_num_10(2,5) = ii_2_5
                                    
                                    % (3,1)
                                    v_3_1_set = unique([v_existing_num_10(3,:),v_existing_num_10(:,1)']);
                                    v_3_1_set_avai = setdiff(fullset,v_3_1_set)
                                    for ii_3_1 = v_3_1_set_avai
                                        % 取得先前的干净数据
                                        v_existing_num_11 = v_existing_num_10;
                                        
                                        % 更新已有数据
                                        v_existing_num_11(3,1) = ii_3_1
                                        
                                        % (3,2)
                                        % 数据已经有了,不用做改变
                                        % (3,3)
                                        v_3_3_set = unique([v_existing_num_11(3,:),v_existing_num_11(:,3)']);
                                        v_3_3_set_avai = setdiff(fullset,v_3_3_set)
                                        for ii_3_3 = v_3_3_set_avai
                                            % 取得先前的干净数据
                                            v_existing_num_13 = v_existing_num_11;
                                            
                                            % 更新已有数据
                                            v_existing_num_13(3,3) = ii_3_3
                                            
                                            % (3,4)
                                            v_3_4_set = unique([v_existing_num_13(3,:),v_existing_num_13(:,4)']);
                                            v_3_4_set_avai = setdiff(fullset,v_3_4_set)
                                            for ii_3_4 = v_3_4_set_avai
                                                % 取得先前的干净数据
                                                v_existing_num_14 = v_existing_num_13;
                                                
                                                % 更新已有数据
                                                v_existing_num_14(3,4) = ii_3_4
                                                
                                                % (3,5)
                                                v_3_5_set = unique([v_existing_num_14(3,:),v_existing_num_14(:,5)']);
                                                v_3_5_set_avai = setdiff(fullset,v_3_5_set)
                                                for ii_3_5 = v_3_5_set_avai
                                                    % 取得先前的干净数据
                                                    v_existing_num_15 = v_existing_num_14;
                                                    
                                                    % 更新已有数据
                                                    v_existing_num_15(3,5) = ii_3_5
                                                    
                                                    % (4,1)
                                                    v_4_1_set = unique([v_existing_num_15(4,:),v_existing_num_15(:,1)']);
                                                    v_4_1_set_avai = setdiff(fullset,v_4_1_set)
                                                    for ii_4_1 = v_4_1_set_avai
                                                        % 取得先前的干净数据
                                                        v_existing_num_16 = v_existing_num_15;
                                                        
                                                        % 更新已有数据
                                                        v_existing_num_16(4,1) = ii_4_1
                                                        % (4,2)
                                                        v_4_2_set = unique([v_existing_num_16(4,:),v_existing_num_16(:,2)']);
                                                        v_4_2_set_avai = setdiff(fullset,v_4_2_set)
                                                        for ii_4_2 = v_4_2_set_avai
                                                            % 取得先前的干净数据
                                                            v_existing_num_17 = v_existing_num_16;
                                                            
                                                            % 更新已有数据
                                                            v_existing_num_17(4,2) = ii_4_2
                                                            % (4,3)
                                                            v_4_3_set = unique([v_existing_num_17(4,:),v_existing_num_17(:,3)']);
                                                            v_4_3_set_avai = setdiff(fullset,v_4_3_set)
                                                            
                                                            for ii_4_3 = v_4_3_set_avai
                                                                % 取得先前的干净数据
                                                                v_existing_num_18 = v_existing_num_17;
                                                                % 更新已有数据
                                                                v_existing_num_18(4,3) = ii_4_3
                                                                % (4,4)
                                                                v_4_4_set = unique([v_existing_num_18(4,:),v_existing_num_18(:,4)']);
                                                                v_4_4_set_avai = setdiff(fullset,v_4_4_set)
                                                                for ii_4_4 = v_4_4_set_avai
                                                                    % 取得先前的干净数据
                                                                    v_existing_num_19 = v_existing_num_18;
                                                                    % 更新已有数据
                                                                    v_existing_num_19(4,4) = ii_4_4
                                                                    % (4,5)
                                                                    v_4_5_set = unique([v_existing_num_19(4,:),v_existing_num_19(:,5)']);
                                                                    v_4_5_set_avai = setdiff(fullset,v_4_5_set)
                                                                    for ii_4_5 = v_4_5_set_avai
                                                                        % 取得先前的干净数据
                                                                        v_existing_num_20 = v_existing_num_19;
                                                                        
                                                                        % 更新已有数据
                                                                        v_existing_num_20(4,5) = ii_4_5
                                                                        % (5,1)
                                                                        v_5_1_set = unique([v_existing_num_20(5,:),v_existing_num_20(:,1)']);
                                                                        v_5_1_set_avai = setdiff(fullset,v_5_1_set)
                                                                        for ii_5_1 = v_5_1_set_avai
                                                                            % 取得先前的干净数据
                                                                            v_existing_num_21 = v_existing_num_20;
                                                                            
                                                                            % 更新已有数据
                                                                            v_existing_num_21(5,1) = ii_5_1
                                                                            % (5,2)
                                                                            v_5_2_set = unique([v_existing_num_21(5,:),v_existing_num_21(:,2)']);
                                                                            v_5_2_set_avai = setdiff(fullset,v_5_2_set)
                                                                            
                                                                            for ii_5_2 = v_5_2_set_avai
                                                                                % 取得先前的干净数据
                                                                                v_existing_num_22 = v_existing_num_21;
                                                                                % 更新已有数据
                                                                                v_existing_num_22(5,2) = ii_5_2
                                                                                % (5,3)
                                                                                v_5_3_set = unique([v_existing_num_22(5,:),v_existing_num_22(:,3)']);
                                                                                v_5_3_set_avai = setdiff(fullset,v_5_3_set)
                                                                                for ii_5_3 = v_5_3_set_avai
                                                                                    % 取得先前的干净数据
                                                                                    v_existing_num_23 = v_existing_num_22;
                                                                                    % 更新已有数据
                                                                                    v_existing_num_23(5,3) = ii_5_3
                                                                                    % (5,4)
                                                                                    % 已经有数据了
                                                                                    % (5,5)
                                                                                    v_5_5_set = unique([v_existing_num_23(5,:),v_existing_num_23(:,5)']);
                                                                                    v_5_5_set_avai = setdiff(fullset,v_5_5_set)
                                                                                    for ii_5_5 = v_5_5_set_avai
                                                                                        % 取得先前的干净数据
                                                                                        v_existing_num_25 = v_existing_num_23;
                                                                                        % 更新已有数据
                                                                                        v_existing_num_25(5,5) = ii_5_5
                                                                                        
                                                                                        flag = validation_44Matrix( v_existing_num_25, matrix_4_4 )
                                                                                        
                                                                                        if flag  % 为1, 则输出到txt
                                                                                            result_file = fopen(kkk_file,'a');%'A.txt'为文件名;'a'为打开方式:在打开的文件末端添加数据,若文件不存在则创建。
                                                                                            fprintf(result_file,'%8d%8d%8d%8d%8d \n',v_existing_num_25(1,:));%fp为文件句柄,指定要写入数据的文件。注意:%d后有空格。
                                                                                            fprintf(result_file,'%8d%8d%8d%8d%8d \n',v_existing_num_25(2,:));
                                                                                            fprintf(result_file,'%8d%8d%8d%8d%8d \n',v_existing_num_25(3,:));
                                                                                            fprintf(result_file,'%8d%8d%8d%8d%8d \n',v_existing_num_25(4,:));
                                                                                            fprintf(result_file,'%8d%8d%8d%8d%8d \n',v_existing_num_25(5,:));
                                                                                        end
                                                                                    end
                                                                                    % end
                                                                                end
                                                                            end
                                                                        end
                                                                    end
                                                                end
                                                            end
                                                        end
                                                    end
                                                end
                                            end
                                        end
                                        % end
                                    end
                                end
                            end
                        end
                    end
                end
            end
        end
        % end
    end
end

check 函数

function flag = validation_44Matrix( potential_answer, matrix_4_4 )
% author: ruogu7
% email: 380545156@qq.com
% date: 07/01/2020
% latest update: 07/02/2020
% link: https://zhuanlan.zhihu.com/p/152489404
% potential_answer = [ 1 3 2 4 5;
%      5     1     2     4     3
%      1     5     4     3     2
%      2     4     3     1     5
%      3     2     1     5     4
%      4     3     5     2     1]
% 44matrix = [ 4 4 2 2 ;
%              4 2 3 4;
%              2 3 4 4;
%              2 4 4 4;]
flag_44matrix = 1;
flag = 1;
for ii = 1:4
    for jj = 1:4
        kkk = [potential_answer(ii,jj) potential_answer(ii,jj+1) potential_answer(ii+1,jj) potential_answer(ii+1,jj+1)  ];
        gap = max(kkk) - min(kkk);
        if gap ~= matrix_4_4(ii,jj)   % 不满足条件,立即退出此轮循环,并在外循环中,再次退出。
            flag_44matrix = 0;
            break;            
        end        
    end
    if ~flag_44matrix
        flag = flag_44matrix;
        break;
    end
end

聚圣源孙和徐一起取名字章汉强憨厚金闺婉媚审计局待遇下载起名免费版女孩程氏取名起名大全2020年姓吴男孩起什么名字好网络起名字的根据八字起名唐姓小孩起名字好的股票论坛起名字2021八字起名梦见母鸡下蛋宋词中女孩起名面包新语古诗词公司起名中式设计找四合茗苑华联超市加盟梦醒血未停大学教材龙起名字男孩名字大全猪年孩子起名宜用字属老鼠 起名1518起名姓名辽宁电视台网站亚米契斯海鲜水产店铺取名起名字女孩小名起什么好听专心致志的意思淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化