构造数独 算法及代码实现
2012-08-11 16:17
537 查看
子标题: 编程之美1.15——构造数独
转载信息: http://blog.csdn.net/linyunzju/article/details/7673959
问题:
构造一个9*9的方格矩阵,玩家要在每个方格中,分别填上1至9的任意一个数字,
让整个棋盘每一列、每一行以及每一个3*3的小矩阵中的数字都不重复。
首先我们通过一个深度优先搜索来生成一个可行解,然后随机删除一定数量的数字,
以生成一个数独。
#include<iostream>
#include<cstdlib>
usingnamespace std;
#define LEN 9
#define CLEAR(a) memset((a),0,sizeof(a))
int level[]={30,37,45};
int grid[LEN+1][LEN+1];
int value[LEN+1];
voidnext(int&x,int&y)
{
x++;
if(x>9)
{
x =1;
y++;
}
}
// 选择下一个有效状态
int pickNextValidValue(int x,int y,int cur)
{
CLEAR(value);
int i, j;
for(i=1; i<y; i++)
value[grid[i][x]]=1;
for(j=1; j<x; j++)
value[grid[y][j]]=1;
int u =(x-1)/3*3+1;
int v =(y-1)/3*3+1;
for(i=v; i<v+3; i++)
for(j=u; j<u+3; j++)
{
value[grid[i][j]]=1;
}
for(i=cur+1; i<=LEN && value[i]; i++);
return i;
}
void pre(int&x,int&y)
{
x--;
if(x<1)
{
x =9;
y--;
}
}
int times =0;
int main()
{
int x, y, i, j;
x = y =1;
// 深度搜索的迭代算法
while(true)
{
times++;
// 满足成功结果
if(y==LEN && x==LEN)
{
for(i=1; i<=LEN; i++)
{
for(j=1; j<=LEN; j++)
cout << grid[i][j]<<" ";
cout << endl;
}
cout << times << endl;
break;
//pre(x, y);
//times = 0;
}
// 满足失败结果
if(y==0)
break;
// 改变状态
grid[y][x]= pickNextValidValue(x, y, grid[y][x]);
if(grid[y][x]> LEN)
{
// 恢复状态
grid[y][x]=0;
pre(x, y);
}
else
// 进一步搜索
next(x,y);
}
for(i=1; i<= level[2]; i++)
{
int ind = rand()%(LEN*LEN);
grid[ind/LEN+1][ind%LEN]=0;
}
for(i=1; i<=LEN; i++)
{
for(j=1; j<=LEN; j++)
cout << grid[i][j]<<" ";
cout << endl;
}
}
转载信息: http://blog.csdn.net/linyunzju/article/details/7673959
问题:
构造一个9*9的方格矩阵,玩家要在每个方格中,分别填上1至9的任意一个数字,
让整个棋盘每一列、每一行以及每一个3*3的小矩阵中的数字都不重复。
首先我们通过一个深度优先搜索来生成一个可行解,然后随机删除一定数量的数字,
以生成一个数独。
#include<iostream>
#include<cstdlib>
usingnamespace std;
#define LEN 9
#define CLEAR(a) memset((a),0,sizeof(a))
int level[]={30,37,45};
int grid[LEN+1][LEN+1];
int value[LEN+1];
voidnext(int&x,int&y)
{
x++;
if(x>9)
{
x =1;
y++;
}
}
// 选择下一个有效状态
int pickNextValidValue(int x,int y,int cur)
{
CLEAR(value);
int i, j;
for(i=1; i<y; i++)
value[grid[i][x]]=1;
for(j=1; j<x; j++)
value[grid[y][j]]=1;
int u =(x-1)/3*3+1;
int v =(y-1)/3*3+1;
for(i=v; i<v+3; i++)
for(j=u; j<u+3; j++)
{
value[grid[i][j]]=1;
}
for(i=cur+1; i<=LEN && value[i]; i++);
return i;
}
void pre(int&x,int&y)
{
x--;
if(x<1)
{
x =9;
y--;
}
}
int times =0;
int main()
{
int x, y, i, j;
x = y =1;
// 深度搜索的迭代算法
while(true)
{
times++;
// 满足成功结果
if(y==LEN && x==LEN)
{
for(i=1; i<=LEN; i++)
{
for(j=1; j<=LEN; j++)
cout << grid[i][j]<<" ";
cout << endl;
}
cout << times << endl;
break;
//pre(x, y);
//times = 0;
}
// 满足失败结果
if(y==0)
break;
// 改变状态
grid[y][x]= pickNextValidValue(x, y, grid[y][x]);
if(grid[y][x]> LEN)
{
// 恢复状态
grid[y][x]=0;
pre(x, y);
}
else
// 进一步搜索
next(x,y);
}
for(i=1; i<= level[2]; i++)
{
int ind = rand()%(LEN*LEN);
grid[ind/LEN+1][ind%LEN]=0;
}
for(i=1; i<=LEN; i++)
{
for(j=1; j<=LEN; j++)
cout << grid[i][j]<<" ";
cout << endl;
}
}
相关文章推荐
- K近邻分类算法与kdTree实现的伪代码(构造kdTree 和 kdTree上搜索最近邻)
- 数独问题的一种简单算法代码实现
- KNN算法Python实现(代码来自机器学习实战)及注释
- [转][ASP]无限级分类的简单算法实现及代码重点讲解
- 算法:二叉树的先(根)序遍历、中(根)序遍历、后(根)序遍历(递归及压栈出栈实现的非递归方式)的java代码实现
- 用java开发编译器之:代码实现Thompson构造1,输入文本预处理
- 第七篇:Logistic回归分类算法原理分析与代码实现
- 《数据结构》线性表:链式存储结构实现示例代码一(构造,遍历,析构)
- 图的邻接矩阵表示与最短路径算法( Dijkstra )代码实现
- 负载均衡的几种基本算法和java代码实现
- 经典算法python代码实现
- 算法:集合的划分原理及代码实现
- 传统字符串匹配算法--Brute Force算法的C代码实现
- 图像细化算法 opencv实现 完整代码(附实验结果)
- Python实现字符串匹配算法代码示例
- 二叉排序树的构造、查找、插入及删除算法的实现(C++)
- 利用朴素贝叶斯算法进行分类-Java代码实现
- 用代码实现二叉树的遍历-Java经典面试题算法部分核心