数独sudoku的生成与破解Word文件下载.docx
- 文档编号:22985517
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:23
- 大小:61.87KB
数独sudoku的生成与破解Word文件下载.docx
《数独sudoku的生成与破解Word文件下载.docx》由会员分享,可在线阅读,更多相关《数独sudoku的生成与破解Word文件下载.docx(23页珍藏版)》请在冰豆网上搜索。
如果这个不确定度大于1,则就要重新这次挖格子。
另外也有可能挖遍所有的格子(程序中我设的上限是81次)也没有合适解时,那么要中止这次操作,这时就要从重新生成一个数独。
五、游戏的难易程序
这个问题我是这么考虑的,只要生成的数独中的空格数(blank)越多,那么就越难。
所以在些程序中我设置三个级别:
1 容易:
blank=33~35;
2 中等:
blank=36~38;
3 困难:
blank=39~41;
六、源程序
#ifndefSUDOKU_RICK_0701_
#defineSUDOKU_RICK_0701_
classCSudoku
{
intmap[9][9];
intblanks;
intsmod;
intsolves;
intcheck(int,int,int*);
voiddfs();
public:
enum{ANY=0,ALL=1};
CSudoku(int);
CSudoku:
:
CSudoku(int*data);
voidSudokuGenerator(int);
//随机生成数独,n越大越难
voidSudokuGenerator(int*data);
//人工指定数独
//virtual~CSudoku();
voiddisplay();
//显示数独
intresolve(intmod=ALL);
//解数独
voidanalyze();
};
#endif
#include"
stdio.h"
stdlib.h"
time.h"
iostream"
iomanip"
//要用到格式控制符
usingnamespacestd;
CSudoku:
CSudoku(intn)
intj;
j=rand()%3;
blanks=n+j;
SudokuGenerator(blanks);
cout<
<
endl<
"
随机数独:
endl;
//cout<
(空格子数为"
blanks<
)"
display();
pressentertocontinue!
"
getchar();
while
(1)
{
cout<
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%"
%%请选择您的操作:
%%"
%%============================%%"
%%%%"
%%1.显示当前数独%%"
%%2.分析求解%%"
%%3.查看结果%%"
%%4.返回%%"
intselect;
cin>
>
select;
switch(select)
{
case1:
{
cout<
当前随机数独:
display();
getchar();
break;
}
case2:
analyze();
case3:
显示结果:
resolve();
case4:
return;
default:
输入错误,请重新输入."
}
}
}
CSudoku(int*data)
SudokuGenerator(data);
已知数独为:
analyze();
voidCSudoku:
SudokuGenerator(intn)
inti,j;
intmark[10];
srand(time(0));
//每一行i产生一个随机位置(列j)并置为当前行值i+1,0=<
i,j<
=8。
do
for(i=0;
i<
9;
++i)
for(j=0;
j<
++j)
map[i][j]=0;
j=rand()%9;
map[i][j]=i+1;
//display();
}
while(!
resolve(ANY));
//生成完整的随机Sudoku表格
//挖窟窿
for(intk=0;
k<
n;
++k)
inttmp,flag=0,sum=1;
do
//cout<
sum="
sum<
if(sum++>
81)
SudokuGenerator(n);
return;
if(flag==1)
map[i][j]=tmp;
do
i=rand()%81;
j=i%9;
i=i/9;
while(map[i][j]==0);
tmp=map[i][j];
flag=1;
while(check(i,j,mark)>
1);
SudokuGenerator(int*data)
int*pm=(int*)map;
for(inti=0;
81;
pm[i]=data[i];
display()
printf("
┏━┯━┯━┳━┯━┯━┳━┯━┯━┓\n"
);
for(intj=0;
if(map[i][j]>
0)
if(j%3==0)
printf("
┃%d"
map[i][j]);
else
│%d"
else
┃"
│"
printf("
┃\n"
if(i!
=8)
if((i+1)%3==0)
printf("
┣━┿━┿━╋━┿━┿━╋━┿━┿━┫\n"
┠─┼─┼─╂─┼─┼─╂─┼─┼─┨\n"
}}
┗━┷━┷━┻━┷━┷━┻━┷━┷━┛\n"
intCSudoku:
resolve(intmod)
smod=mod;
if(mod==ALL)
solves=0;
dfs();
returnsolves;
elseif(mod==ANY)
try
dfs();
return0;
catch(int)
return1;
return0;
check(inty,intx,int*mark)
inti,j,is,js,count=0;
for(i=1;
=9;
mark[i]=0;
for(i=0;
mark[map[y][i]]=1;
mark[map[i][x]]=1;
is=y/3*3;
js=x/3*3;
3;
for(j=0;
mark[map[is+i][js+j]]=1;
if(mark[i]==0)
count++;
returncount;
dfs()
inti,j,im=-1,jm,min=10;
//display();
//求自由度最小的格map[im][jm]
if(map[i][j])//如果此格已填入数则看一下格。
continue;
intc=check(i,j,mark);
//如果此格空,则求其自由度。
if(c==0)//已到结尾,没有空格了。
if(c<
min)
im=i;
jm=j;
min=c;
if(im==-1)//若im=-1,则格子都填满。
if(smod==ALL)//smod==ALL是求解过程。
//printf("
No.%d:
\n"
++solves);
display();
return;
}
elseif(smod==ANY)//smod==ANY是初始化过程。
throw
(1);
check(im,jm,mark);
if(mark[i]==0)
map[im][jm]=i;
//从小到大让第一个可填的数填入自由度最小的格。
map[im][jm]=0;
analyze()
%%请问你想做什么?
%%1.查找最小不确定度的格子%%"
%%2.指定格子的可填数%%"
%%3.给指定格子填数%%"
%%4.显示当前数独%%"
%%5.查看结果%%"
%%6.返回%%"
switch(select)
//求不确定度最小的空格map[im][jm]
inti,j,im=-1,jm,min=10;
intmark[10];
for(i=0;
{
for(j=0;
{
if(map[i][j])//如果此格已填入数则看一下格。
continue;
intc=check(i,j,mark);
//如果此格空,则求其不确定度。
if(c==0)
{
cout<
不能得到结果或已无空格子!
自动返回!
return;
}
if(c<
im=i;
jm=j;
min=c;
}
}
不确定度最小的格子为:
["
im<
"
jm<
]"
其可填的数的个数为:
min<
intx,y;
请输入格子位置(如[2,4],则输入:
24,中间用空格.):
[x,y]="
;
cin>
x>
y;
while(map[x][y]!
=0)
cout<
警告:
此格已经有数!
请重新输入."
请重新输入格子位置(如[2,4],则输入:
cin>
getchar();
inti,j,is,js,count=0;
for(i=1;
mark[i]=0;
mark[map[x][i]]=1;
mark[map[i][y]]=1;
is=x/3*3;
js=y/3*3;
mark[map[is+i][js+j]]=1;
此格可填数为:
if(mark[i]==0)
count++;
setw(4)<
i;
XX文库-让每个人平等地提升自我cout<
XX文库-让每个人平等地提升自我XX文库-让每个人平等地提升自我case3:
请输入您要填格子的位置(如[2,4],则输入:
请输入要填入的数:
map[x][y];
您填入的格为:
map["
x<
y<
]="
map[x][y]<
case5:
//没有输入参数,则默认为smod==ALL,见程序开始函数声明。
case6:
voidmain()
boolexit_f=true;
%%%%%%%%%%%%%%%%%%%%%%%%%"
%%SUDOKU游戏%%"
%%任二艳制作%%"
%%=====================%%"
%%1.新游戏%%"
%%2.退出%%"
//开始新游戏
while(exit_f)
%%请选择游戏难度%%"
%%1.简单%%"
%%2.中等%%"
%%3.困难%%"
/*cout<
请选择游戏难度:
======================="
1.简单"
2.中等"
3.困难"
4.解一个已知数独"
5.退出"
endl
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- sudoku 生成 破解