本文主要是介绍1.15 构造数独,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
(一)
用回溯法构造数独
#include <iostream>
#include <cstring>
#include <ctime>
#include <cstdio>
#include <cstdlib>
using namespace std;
int sudu[9][9];
void sudu_print(int sudu[][9]) {
for(int i = 0; i < 9; ++i) {
for(int j = 0; j < 9; ++j) {
cout << " " << sudu[i][j];
}
cout << endl;
};
}
bool is_digital_sudu(int sudu[][9], int i, int j) {
for(int k = 0; k < 9; ++k) {
if(k == j) continue;
if(sudu[i][k] == sudu[i][j]) return false;
}
for(int k = 0; k < 9; ++k) {
if(k == i) continue;
if(sudu[k][j] == sudu[i][j]) return false;
}
int p = i / 3;
int q = j / 3;
for(int m = 3 * p; m < 3 * p + 3; ++m) {
for(int n = 3 * q; n < 3 * q + 3; ++n)
if(m != i && n != j && sudu[m][n] == sudu[i][j]) return false;
}
return true;
}
int main() {
srand(time(0));
memset(sudu, 0, sizeof(sudu));
for(int i = 0; i < 9; ++i) {
int temp = rand() % 81;
sudu[temp/9][temp%9] = i + 1;
}
int k = 0;
while(1) {
int x = k / 9;
int y = k % 9;
while(1) {
sudu[x][y]++;
if(sudu[x][y] == 10) {
sudu[x][y] = 0;
--k;
break;
}else if(is_digital_sudu(sudu, x, y)) {
k++;
break;
}
}
if(81 == k) {
sudu_print(sudu);
return 0;
}
}
return 0;
}
在LINUX下执行的话,先执行命令:g++ 文件名.cpp 然后如果程序没有错误的话,那么在该目录下面会自动生成一个文件:.out。所以这个时候继续在该目录下执行:
./a.out
(二)
利用书上的置换的方法,简单。。。。。。
这篇关于1.15 构造数独的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!