九宫格VC代码
下面是一个用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;
}