文档章节

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

北风其凉
 北风其凉
发布于 2014/05/30 23:11
字数 919
阅读 199
收藏 1

数独矩阵即满足如下要求的矩阵:阶为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

© 著作权归作者所有

共有 人打赏支持
北风其凉

北风其凉

粉丝 115
博文 498
码字总数 463468
作品 4
朝阳
程序员
私信 提问
Armadillo C++ Library 4.100 发布

Armadillo C++ Library 4.100 发布,此版本能快速的处理稀疏子矩阵视图,更好的使用 Clang C++ 编译器生成代码。它同时修复了 LAPACK 3.4 的 bug 。 Armadillo C++ Library 是一种C++的线性代...

oschina
2014/03/04
908
0
基于 C++ 语言库的 GCC 和 Clang 编译器基准测试报告(ETL)

从我使用 C++ 代码完成了不同编译器的基准测试到现在,已经有一段时间了。由于我最近发布了 ETL 项目的 1.1 版(一个具有表达式模板的优化矩阵/向量计算库),所以我决定使用它作为我的基准测...

oschina
2017/08/16
489
0
【经验】提高MATLAB程序的运行效率

在使用MATLAB的过程中,我对MATLAB的运行效率感到很头疼,就尝试了一些办法去提高之。现在把它们在这里作个总结,留作备忘和分享,之后有了新的想法也会补充进来。 使用矩阵运算替换循环语句...

CHN_alpha
07/31
0
0
Armadillo C++ Library 3.6.0 发布

Armadillo C++ Library 3.6.0 可更快的处理 submatrices和 subcubes,同时扩展了稀疏矩阵功能。 Armadillo C++ Library 是一种C++的线性代数库(矩阵数学)以取得良好的平衡速度与易用性。整...

oschina
2012/12/08
1K
3
Armadillo C++ Library 3.800 发布

Armadillo C++ Library 3.800 发布,从该版本开始,许可证协议改为 MPL 2.0,增加了使用仿函数和 C++11 lambda 表达式实现的矩阵的填充和转换函数,修复了一些 bug。 Armadillo C++ Library ...

oschina
2013/03/02
1K
2

没有更多内容

加载失败,请刷新页面

加载更多

Java 11 已发布,String 还能这样玩!

在文章《Java 11 正式发布,这 8 个逆天新特性教你写出更牛逼的代码》中,我有介绍到 Java 11 的八个新特性,其中关于 String 加强部分,我觉得有点意思,这里单独再拉出来讲。 Java 11 增加...

Java技术栈
21分钟前
1
0
什么是以太坊DAO?(二)

Decentralized Autonomous Organization,简称DAO,以太坊中重要的概念。一般翻译为去中心化的自治组织。 在上一节中,我们为了展示什么是DAO创建了一个合约,就像一个采用邀请制的俱乐部,会...

geek12345
37分钟前
4
0
全屋WiFi彻底无死角 这才是终极解决方案

无线网络现在不仅在家庭中不可或缺,在酒店、医院、学校等场景中的需求也越来越多。尤其是这些场景中,房间多但也需要每个房间都能够完美覆盖WiFi,传统的吸顶式AP就无法很好的解决问题。 H3...

linux-tao
51分钟前
4
0
Python日期字符串比较

需要用python的脚本来快速检测一个文件内的二个时间日期字符串的大小,其实实现很简单,首先一些基础的日期格式化知识如下 复制代码 %a星期的简写。如 星期三为Web %A星期的全写。如 星期三为...

dragon_tech
51分钟前
3
0
ORA 各种oraclesql错误

ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出最大进程数 () ORA-00021: 会话附属于其它某...

青峰Jun19er
55分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部