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

北风其凉

１）设定一个初始矩阵matrix，该矩阵是一个满足条件的数独矩阵

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

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

４）最后得到的矩阵即为所求

``````#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

### 北风其凉

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

oschina
2014/03/04
908
0

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

CHN_alpha
07/31
0
0

oschina
2012/12/08
1K
3

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技术栈
21分钟前
1
0

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

geek12345
37分钟前
4
0

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

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

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

55分钟前
4
0