九宫格VC代码

这就是数独,就是下图所示的9*9的格子。你仍然想要输出所有数独吗?要知道,数独有6670903752021072936960种不同的种类。即使计算机(运行效率非常高)每秒生成65,438+00个数独,你也能算出来,这需要几千年的时间。具体可以去百度的百科。这是一个用Pascal写的数独程序。

下面是一个用C++写的随机生成数独的算法。不可能及时输出所有数独:

#ifndef?数独_RICK_0701_

#定义?数独_RICK_0701_

班级?CSudoku

{

int?地图[9][9];

int?smod

int?解决;

int?check(int,int,int *);

作废?DFS();

公共:

enum{ANY=0,ALL = 1 };

CSudoku(int?n = 40);//?随机生成数独,n越大,难度越大。

CSudoku(int?*数据);//?手动指定数独

虚拟的?~ CSU doku();

作废?显示();//?显示数独

int?resolve(int?mod = ALL);//?解答数独(谜题)

};

#endif

//#包含?"数独. h "

#包含?" stdio.h "

#包含?" stdlib.h "

#包含?"时间. h "

CSudoku::CSudoku(int?n)

{

int?I,j;

srand(time(0));

{

for(I = 0;我& lt9;++i)

{

for(j = 0;j & lt9;++j)

map[I][j]= 0;

j = rand()% 9;

map[I][j]= I+1;

}

}

而(!resolve(ANY));

//?打洞

for(int?k = 0;k & ltn;)

{

I = rand()% 81;

j = I % 9;

I = I/9;

if(map[I][j]& gt;0)

{

map[I][j]= 0;

++ k;

}

}

//printf("(随机化?数独?创造了?用什么?%d?空白。)\n”,空格);

}

CSudoku::CSudoku(int?*数据)

{

int?* pm =(int *)map;

for(int?I = 0;我& lt81;++i)

pm[I]= data[I];

}

CSudoku::~CSudoku()

{

返回;

}

作废?CSudoku::display()

{

for(int?I = 0;我& lt9;++i)

{

for(int?j = 0;j & lt9;++j)

{

if(map[I][j]& gt;0)

printf(" & lt;?%d?& gt?",map[I][j]);

其他

printf("[]?");

}

printf(" \ n ");

}

}

int?CSudoku::resolve(int?mod)

{

smod = mod

if(mod==ALL)

{

solves = 0;

DFS();

回归?解决;

}

不然呢?if(mod==ANY)

{

尝试

{

DFS();

回归?0;

}

捕捉(整数)

{

回归?1;

}

}

回归?0;

}

int?CSudoku::check(int?y,int?x,int?*标记)

{

int?I,j,is,js,count = 0;

for(I = 1;我& lt=9;++i)

mark[I]= 0;

for(I = 0;我& lt9;++i)

mark[map[y][I]]= 1;

for(I = 0;我& lt9;++i)

mark[map[I][x]]= 1;

is = y/3 * 3;

js = x/3 * 3;

for(I = 0;我& lt3;++i)

{

for(j = 0;j & lt3;++j)

mark[map[is+I][js+j]]= 1;

}

for(I = 1;我& lt=9;++i)

if(mark[i]==0)

count++;

回归?数数;

}

作废?CSudoku::dfs()

{

int?I,j,im=-1,jm,min = 10;

int?马克[10];

for(I = 0;我& lt9;++i)

{

for(j = 0;j & lt9;++j)

{

if(map[i][j])

继续;

int?c=check(i,j,mark);

如果(c==0)

返回;

if(c & lt;最小)

{

im = I;

JM = j;

min = c;

}

}

}

if(im==-1)

{

if(smod==ALL)

{

printf("编号?%d:\n ",++求解);

显示();

返回;

}

不然呢?if(smod==ANY)

{

抛(1);

}

}

检查(im,jm,mark);

for(I = 1;我& lt=9;++i)

{

if(mark[i]==0)

{

map[im][JM]= I;

DFS();

}

}

map[im][JM]= 0;

}

#包含?& ltiostream & gt

//#包含?"数独. h "

使用?命名空间?std

int?主()

{

int?data1[]=

{4,9,0,0,0,6,0,2,7,

5,0,0,0,1,0,0,0,4,

6,0,0,0,0,8,0,0,3,

1,0,4,0,0,0,0,0,0,

0,6,0,0,0,0,0,5,0,

0,0,0,0,0,0,2,0,8,

7,0,0,2,0,0,0,0,5,

8,0,0,0,9,0,0,0,1,

3,4,0,5,0,0,0,6,2

};

int?数据2[]=

{7,4,0,0,8,0,0,1,6,

9,0,0,0,3,5,0,0,4,

0,0,0,7,0,0,0,0,0,

0,7,0,0,0,9,5,0,0,

6,1,0,0,5,0,0,8,7,

0,0,2,6,0,0,0,4,0,

0,0,0,0,0,4,0,0,0,

3,0,0,5,6,0,0,0,2,

5,6,0,0,1,0,0,3,9

};

int?数据3[]=

{

0,0,3,0,0,0,0,0,4,

9,0,0,0,0,3,0,5,0,

2,0,0,7,0,0,0,0,0,

0,8,0,0,1,0,0,0,6,

0,3,0,2,0,0,0,9,0,

4,0,0,0,0,0,0,1,0,

0,0,0,0,0,8,0,0,3,

0,6,0,9,0,0,0,0,8,

5,0,0,0,0,0,2,0,0

//?0,3,0,9,0,0,0,1,0,

//?0,8,0,0,0,0,0,7,0,

//?7,0,2,4,0,0,9,0,0,

//?0,7,0,0,1,0,0,4,0,

//?1,0,0,0,0,6,0,0,9,

//?0,6,0,0,0,0,0,3,0,

//?0,0,8,0,0,9,5,0,3,

//?0,1,0,0,0,0,0,9,0,

//?0,9,0,0,0,2,0,6,0

};

int?空白;

cout & lt& lt”随机生成一个数独游戏并输入空格数”;

CIN & gt;& gt空白;

CSudoku?s(空白);

s.display()。

cout & lt& lt"开始解数独:"

s . resolve();

cout & lt& lt"解决数独:"

CSudoku?t(数据3);

t.display()。

cout & lt& lt"开始解数独:"

t . resolve(1);

回归?0;

}