文档章节

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

北风其凉
 北风其凉
发布于 2014/05/30 23:11
字数 919
阅读 191
收藏 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

© 著作权归作者所有

共有 人打赏支持
北风其凉

北风其凉

粉丝 114
博文 498
码字总数 463468
作品 4
朝阳
程序员
【经验】提高MATLAB程序的运行效率

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

CHN_alpha
07/31
0
0
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
面向科学计算的高性能动态编程语言 - Julia

Julia是一个新的高性能动态高级编程语言。语法和其他编程语言类似,易于其他语言用户学习。Julia拥有丰富的函数库,提供了数字精度、精致的增幅器(sophisticated amplifier)和分布式并行运...

匿名
2012/02/27
0
3
内存泄露:a CDynLinkLibrary object at...的解决

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

郭廷钧
2011/01/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

TypeScript基础入门之高级类型的索引类型(Index types)

转发 TypeScript基础入门之高级类型的索引类型(Index types) 高级类型 索引类型(Index types) 使用索引类型,编译器就能够检查使用了动态属性名的代码。 例如,一个常见的JavaScript模式是从...

durban
28分钟前
0
0
利用碎片化时间Get Linux系统

起初,我做着一份与IT毫无关系的工作,每月领着可怜的工资,一直想改变现状,但无从下手,也就是大家熟知的迷茫。我相信,每一个人都会或多或少的经历过迷茫,迷茫每一个选择,迷茫工作或者生...

Linux就该这么学
今天
1
0
图像显示深入学习一:Activity启动过程

一个月左右写了图像显示深入学习之文章开篇文章表明了自己近期的计划,前半年重新学习了opengl es,c++以及Linux的一些知识,觉得是时候开始看图像这一块的源码了,边看边补缺补漏吧。 作为该...

JerryLin123
今天
3
0
给MySQL授权远程访问

putty登录服务器; 登录MySQL: mysql -u root -p 新建远程用户: CREATE USER 'myusername' IDENTIFIED BY 'mypassword'; 授权: grant all on *.* to john@'101.102.103.104' identified by......

sweethome
今天
3
0
在t-io老巢造谣,不过有造谣的就会有反造谣的!

只发当事人的截图,不发表评论,以免有引导嫌疑 PS: 截图是由不同的人发过来的 本人已经不在此微信群 图3:有造谣的,就有反造谣的 图4是2018-09-23的t-io官方群的一个发言小统计,有助于让...

talent-tan
今天
104
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部