编程之美——构造数独

编程之美——构造数独

问题:

构造一个9*9的方格矩阵,玩家要在每个方格中,分别填上1至9的任意一个数字,
让整个棋盘每一列、每一行以及每一个3*3的小矩阵中的数字都不重复。


首先我们通过一个深度优先搜索来生成一个可行解,然后随机删除一定数量的数字,
以生成一个数独。

测试代码为:
#include <iostream>  
#include <cstdlib>  
using namespace 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];  //标记值


void next(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 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<<endl;
 break;
}
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.youkuaiyun.com/linyunzju/article/details/7673959
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值