文档章节

使用C++生成一个数独矩阵

北风其凉
 北风其凉
发布于 2014/05/30 23:11
字数 919
阅读 188
收藏 1
点赞 0
评论 0

数独矩阵即满足如下要求的矩阵:阶为9的方阵,其每行、每列、将其分为9宫后的每一个3*3的方阵,都包含1-9九个数字各一次。

本段代码所用的算法为:

1)设定一个初始矩阵matrix,该矩阵是一个满足条件的数独矩阵

2)因为每一个满足条件的矩阵,其0-2、3-5、6-8行与0-2、3-5、6-8列间相互打乱顺序,仍然可以得到一个满足条件的矩阵,可以通过随机数打乱它们的顺序

3)因为将一个满足条件的矩阵中任取两个不同的元素,相互替换后仍然可以得到一个满足条件的矩阵(如值A全部换为值B,同时值B全部换为值A),可以通过随机数进行替换

4)最后得到的矩阵即为所求

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main()
{
    //Set the seed of random numbers
    srand((unsigned)time(0));

    //Rule:
    //1.Each block has 9 numbers 1-9
    //2.Each row has 9 numbers 1-9
    //3.Each column has 9 numbers 1-9
    
    int matrix[9][9] = 
    {
        {1, 2, 3,  7, 8, 9,  4, 5, 6},
        {4, 5, 6,  1, 2, 3,  7, 8, 9},
        {7, 8, 9,  4, 5, 6,  1, 2, 3},
        
        {3, 1, 2,  9, 7, 8,  6, 4, 5},
        {6, 4, 5,  3, 1, 2,  9, 7, 8},
        {9, 7, 8,  6, 4, 5,  3, 1, 2},
        
        {2, 3, 1,  8, 9, 7,  5, 6, 4},
        {5, 6, 4,  2, 3, 1,  8, 9, 7},
        {8, 9, 7,  5, 6, 4,  2, 3, 1}
    };
    
    //1.Change rows and columns
    int counter = 30;
    while(--counter)
    {
        int i = rand() % 3;  //big row no.
        int j = rand() % 3;  //big column no.
        int k = rand() % 2;  //0:horizontally 1:vertically
        
        //0:123 1:132 2:213 3:231 4:312 5:321
        switch(rand() % 6)
        {
            case 0: break; //123 
            case 1: //132
                {
                    if(k == 0)
                    {
                        int temp;
                        for(int counter = 0; counter < 9; counter++)
                        {
                            temp = matrix[i * 3 + 1][counter];
                            matrix[i * 3 + 1][counter] = matrix[i * 3 + 2][counter];
                            matrix[i * 3 + 2][counter] = temp;
                        }
                    }
                    else
                    {
                        int temp;
                        for(int counter = 0; counter < 9; counter++)
                        {
                            temp = matrix[counter][j * 3 + 1];
                            matrix[counter][j * 3 + 1] = matrix[counter][j * 3 + 2];
                            matrix[counter][j * 3 + 2] = temp;
                        }
                    }
                }
                break;
            case 2: //213
                {
                    if(k == 0)
                    {
                        int temp;
                        for(int counter = 0; counter < 9; counter++)
                        {
                            temp = matrix[i * 3 + 0][counter];
                            matrix[i * 3 + 0][counter] = matrix[i * 3 + 1][counter];
                            matrix[i * 3 + 1][counter] = temp;
                        }
                    }
                    else
                    {
                        int temp;
                        for(int counter = 0; counter < 9; counter++)
                        {
                            temp = matrix[counter][j * 3 + 0];
                            matrix[counter][j * 3 + 0] = matrix[counter][j * 3 + 1];
                            matrix[counter][j * 3 + 1] = temp;
                        }
                    }
                }
                break;
            case 3: //231
                {
                    if(k == 0)
                    {
                        int temp;
                        for(int counter = 0; counter < 9; counter++)
                        {
                            temp = matrix[i * 3 + 0][counter];
                            matrix[i * 3 + 0][counter] = matrix[i * 3 + 1][counter];
                            matrix[i * 3 + 1][counter] = matrix[i * 3 + 2][counter];
                            matrix[i * 3 + 2][counter] = temp;
                        }
                    }
                    else
                    {
                        int temp;
                        for(int counter = 0; counter < 9; counter++)
                        {
                            temp = matrix[counter][j * 3 + 0];
                            matrix[counter][j * 3 + 0] = matrix[counter][j * 3 + 1];
                            matrix[counter][j * 3 + 1] = matrix[counter][j * 3 + 2];
                            matrix[counter][j * 3 + 2] = temp;
                        }
                    }
                }
                break;
            case 4: //312
                {
                    if(k == 0)
                    {
                        int temp;
                        for(int counter = 0; counter < 9; counter++)
                        {
                            temp = matrix[i * 3 + 2][counter];
                            matrix[i * 3 + 2][counter] = matrix[i * 3 + 1][counter];
                            matrix[i * 3 + 1][counter] = matrix[i * 3 + 0][counter];
                            matrix[i * 3 + 0][counter] = temp;
                        }
                    }
                    else
                    {
                        int temp;
                        for(int counter = 0; counter < 9; counter++)
                        {
                            temp = matrix[counter][j * 3 + 2];
                            matrix[counter][j * 3 + 2] = matrix[counter][j * 3 + 1];
                            matrix[counter][j * 3 + 1] = matrix[counter][j * 3 + 0];
                            matrix[counter][j * 3 + 0] = temp;
                        }
                    }
                }
                break;
            case 5: //321
                {
                    if(k == 0)
                    {
                        int temp;
                        for(int counter = 0; counter < 9; counter++)
                        {
                            temp = matrix[i * 3 + 0][counter];
                            matrix[i * 3 + 0][counter] = matrix[i * 3 + 2][counter];
                            matrix[i * 3 + 2][counter] = temp;
                        }
                    }
                    else
                    {
                        int temp;
                        for(int counter = 0; counter < 9; counter++)
                        {
                            temp = matrix[counter][j * 3 + 0];
                            matrix[counter][j * 3 + 0] = matrix[counter][j * 3 + 2];
                            matrix[counter][j * 3 + 2] = temp;
                        }
                    }
                }
                break;
        }
    }

    //2.Change the numbers
    counter = 10;
    while(--counter)
    {
        int tempa = rand() % 9 + 1;
        int tempb;
        do
        {
            tempb = rand() % 9 + 1;
        }while(tempb == tempa);

        for(int i = 0; i < 9; i++)
        {
            for(int j = 0; j < 9; j++)
            {
                if(matrix[i][j] == tempa)
                {
                    matrix[i][j] = tempb;
                }
                else if(matrix[i][j] == tempb)
                {
                    matrix[i][j] = tempa;
                }
            }
        }
    }

    //Print the matrix
    for(int i = 0; i < 9; i++)
    {
        for(int j = 0; j < 9; j++)
        {
            cout << matrix[i][j] << " ";
        }
        cout << endl;
    }

    return 0;
}

END

© 著作权归作者所有

共有 人打赏支持
北风其凉

北风其凉

粉丝 114
博文 497
码字总数 462457
作品 4
朝阳
程序员
C语言/C++编程学习:C语言实现矩阵转置

C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构。C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到...

小辰带你看世界
05/21
0
0
找不到MSVCR90.dll、Debug vs Release及cppLapack相关

最近使用cppLapack,nmake运行正常,在Release模式下也编译运行正常,在Debug模 式下也能编译通过,但一运行就弹出一个对话框,提示没有找到MSVCR90D.dll,程序未能启 动,而如果把该DLL拷贝...

ryany
2010/12/27
0
0
内存泄露:a CDynLinkLibrary object at...的解决

这两天在设计一个项目,独立了几个DLL模块。昨天勉强把前段工作做完了,需要的DLL也都挂进了EXE文件之中,暗自高兴了一把。不过晚上在看的时候,发现VS2005输出窗口提示有内存泄露: a CDyn...

郭廷钧
2011/01/29
0
0
架构编译器框架系统 LLVM 使用简介

LLVM 是什么 LLVM 是 low level virtual machine(底层虚拟机)的简称,它是一个开源的编译器架构,已经被成功应用到多个应用领域。LLVM 的主要作用是它可以作为多种语言的后端,它可以提供可...

Konghy
2015/08/20
0
0
OpenCV学习笔记(四十)——再谈OpenCV数据结构Mat详解

我记得开始接触OpenCV就是因为一个算法里面需要2维动态数组,那时候看core这部分也算是走马观花吧,随着使用的增多,对Mat这个结构越来越喜爱,也觉得有必要温故而知新,于是这次再看看Mat。...

baoxiao7872
04/16
0
0
微软承诺将在今年的 Visual C++ 更新中加入 Clang 编译器

微软最近发布将在2015年11月 Visual C++ 更新中加入 Clang 编译器 ,Clang 开源编译器以相比GCC更快的编译速度和更优的错误提示著称。 Clang关于C,C++,及Objective C的编译器,能够生成LLV...

葡萄城控件技术团队
2015/10/27
0
0
Visual Studio 2012 Build Clang

不知道还有没有人记得Borland C/C++,C/C++四国圣战中的主角,换了老板 如今还在不冷不热的发展 ,支持Win32/Win64 OSX平台,即Embarcadero C++ Builder 现在支持Windows 64编程 最近试了一下...

Force武装卫队
2013/01/14
0
24
SP++3.0已发布,欢迎大家使用(同心协力,共创开源)

SP++ (Signal Processing in C++) 是一个关于信号处理与数值计算的开源C++程序库,该库提供了信号处理与数值计算中常用算法的C++实现。SP++中所有算法都以C++类模板方法实现,以头文件形式组...

张明
2011/02/12
0
55
SWIG与JAVA 交互最全开发指南一

项目背景 最近开始研究做移动端项目,但是本人基本是做了五六年的c++的底层研发,对C++的研发可以说是驾轻就熟了,但是对于android还是属于刚入门阶段,虽然断断续续做移动端也做了一年,但是...

揽月凡尘
06/16
0
0
纯C++代码实现将像素矩阵保存为bmp图片

用C++代码将像素矩阵保存为图片,这里以读取yuv序列视频帧为例进行分析,假设4:2:0yuv序列有300帧,则首先需要将每一视频帧保存在一个像素矩阵中,然后将每一个矩阵保存为图片,最终会有300...

sinat_33718563
03/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

about git flow

  昨天元芳做了git分支管理规范的分享,为了拓展大家关于git分支的认知,这里我特意再分享这两个关于git flow的链接,大家可以看一下。 Git 工作流程 Git分支管理策略   git flow本质上是...

qwfys
今天
1
0
Linux系统日志文件

/var/log/messages linux系统总日志 /etc/logrotate.conf 日志切割配置文件 参考https://my.oschina.net/u/2000675/blog/908189 dmesg命令 dmesg’命令显示linux内核的环形缓冲区信息,我们可...

chencheng-linux
今天
1
0
MacOS下给树莓派安装Raspbian系统

下载镜像 前往 树莓派官网 下载镜像。 点击 最新版Raspbian 下载最新版镜像。 下载后请,通过 访达 双击解压,或通过 unzip 命令解压。 检查下载的文件 ls -lh -rw-r--r-- 1 dingdayu s...

dingdayu
今天
0
0
spring boot使用通用mapper(tk.mapper) ,id自增和回显等问题

最近项目使用到tk.mapper设置id自增,数据库是mysql。在使用通用mapper主键生成过程中有一些问题,在总结一下。 1、UUID生成方式-字符串主键 在主键上增加注解 @Id @GeneratedValue...

北岩
今天
2
0
告警系统邮件引擎、运行告警系统

告警系统邮件引擎 cd mail vim mail.py #!/usr/bin/env python#-*- coding: UTF-8 -*-import os,sysreload(sys)sys.setdefaultencoding('utf8')import getoptimport smtplibfr......

Zhouliang6
今天
0
0
Java工具类—随机数

Java中常用的生成随机数有Math.random()方法及java.util.Random类.但他们生成的随机数都是伪随机的. Math.radom()方法 在jdk1.8的Math类中可以看到,Math.random()方法实际上就是调用Random类...

PrivateO2
今天
1
0
关于java内存模型、并发编程的好文

Java并发编程:volatile关键字解析    volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在...

DannyCoder
昨天
0
0
dubbo @Reference retries 重试次数 一个坑

在代码一中设置 成retries=0,也就是调用超时不用重试,结果DEBUG的时候总是重试,不是0吗,0就不用重试啊。为什么还是调用了多次呢? 结果在网上看到 这篇文章才明白 https://www.cnblogs....

奋斗的小牛
昨天
2
0
数据结构与算法3

要抓紧喽~~~~~~~放羊的孩纸回来喽 LowArray类和LowArrayApp类 程序将一个普通的Java数组封装在LowArray类中。类中的数组隐藏了起来,它是私有的,所以只有类自己的方法才能访问他。 LowArray...

沉迷于编程的小菜菜
昨天
0
0
spring boot应用测试框架介绍

一、spring boot应用测试存在的问题 官方提供的测试框架spring-boot-test-starter,虽然提供了很多功能(junit、spring test、assertj、hamcrest、mockito、jsonassert、jsonpath),但是在数...

yangjianzhou
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部