数独解题系统Word格式文档下载.docx
《数独解题系统Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数独解题系统Word格式文档下载.docx(13页珍藏版)》请在冰豆网上搜索。
charchoice;
//
voidchushi();
//用于初始化
voidinput(inta,intb,intc);
//用于输入数据
voidxuan();
//用于判断是否继续输入
voiddisplay1();
//用于显示题目
voiddisplay2();
//用于显示
voidrealdisplay();
//用于显示答案
voidji(inta,intb,intc);
//用于计算解题
voidfailfind();
//用于无解
voidputin();
voidmain()
while
(1)
{
system("
cls"
);
cout<
<
"
\n\n\n\n"
;
\t\t数独系统\n"
\t\t======================================"
\n\n"
\t\t【1】初始化系统\n"
\t\t【2】按要求输入题目\n"
\t\t【3】显示题目\n"
\t\t【4】显示答案\n"
"
\n"
\t\t【0】退出本系统\n"
\n\t注:
每次输入题目前需初始化系统显示过答案后题目显示会出错\n\n"
\t\t请选择:
<
flush;
choice=getch();
system("
switch(choice)
{
case'
1'
:
chushi();
//用于初始化
break;
2'
putin();
//input();
//用于输入数据
3'
display1();
//用于显示题目
4'
display2();
//显示答案
0'
exit(0);
}
}
}
voidchushi()//初始化数据
for(i=0;
i<
9;
i++)
for(j=0;
j<
j++)
NUM[i][j]=0;
for(k=0;
k<
10;
k++)
{
num[i][j].q[k]=k;
}
//标记前项位置
if(j!
=0)
num[i][j].H=i;
num[i][j].L=j-1;
else
num[i][j].H=i-1;
num[i][j].L=8;
voidputin()
inta,b;
cout<
依次输入已知项0代表空\n"
/*NUM[0][0]=5;
NUM[0][1]=0;
NUM[0][2]=0;
NUM[0][3]=0;
NUM[0][4]=0;
NUM[0][5]=0;
NUM[0][6]=3;
NUM[0][7]=0;
NUM[0][8]=0;
NUM[1][0]=0;
NUM[1][1]=9;
NUM[1][2]=0;
NUM[1][3]=5;
NUM[1][4]=0;
NUM[1][5]=0;
NUM[1][6]=4;
NUM[1][7]=0;
NUM[1][8]=0;
NUM[2][0]=0;
NUM[2][1]=0;
NUM[2][2]=4;
NUM[2][3]=0;
NUM[2][4]=0;
NUM[2][5]=0;
NUM[2][6]=7;
NUM[2][7]=0;
NUM[2][8]=0;
NUM[3][0]=0;
NUM[3][1]=5;
NUM[3][2]=1;
NUM[3][3]=0;
NUM[3][4]=3;
NUM[3][5]=7;
NUM[3][6]=2;
NUM[3][7]=8;
NUM[3][8]=9;
NUM[4][0]=3;
NUM[4][1]=0;
NUM[4][2]=2;
NUM[4][3]=0;
NUM[4][4]=8;
NUM[4][5]=0;
NUM[4][6]=6;
NUM[4][7]=0;
NUM[4][8]=4;
NUM[5][0]=0;
NUM[5][1]=0;
NUM[5][2]=8;
NUM[5][3]=0;
NUM[5][4]=5;
NUM[5][5]=2;
NUM[5][6]=1;
NUM[5][7]=3;
NUM[5][8]=7;
NUM[6][0]=0;
NUM[6][1]=3;
NUM[6][2]=5;
NUM[6][3]=0;
NUM[6][4]=0;
NUM[6][5]=0;
NUM[6][6]=9;
NUM[6][7]=0;
NUM[6][8]=0;
NUM[7][0]=6;
NUM[7][1]=0;
NUM[7][2]=9;
NUM[7][3]=0;
NUM[7][4]=0;
NUM[7][5]=0;
NUM[7][6]=8;
NUM[7][7]=2;
NUM[7][8]=3;
NUM[8][0]=0;
NUM[8][1]=8;
NUM[8][2]=0;
NUM[8][3]=0;
NUM[8][4]=2;
NUM[8][5]=3;
NUM[8][6]=0;
NUM[8][7]=0;
NUM[8][8]=6;
display1();
*//*测试用的题目*/
/********************
*测试题答案:
*
*516274398*
*793568412*
*824391765*
**
*451637289*
*372189654*
*968452137*
*235846971*
*649715823*
*187923546*
********************/
for(a=0;
a<
a++)
for(b=0;
b<
b++)
cin>
>
NUM[a][b];
if(NUM[a][b]!
input(a,b,NUM[a][b]);
voidinput(intaa,intbb,intcc)//输入已知项
inta,b,c,temp;
h=aa+1;
l=bb+1;
temp=cc;
a=l;
num[h-1][l-1].q[0]=temp;
//排除干扰数据
for(i=1;
num[h-1][l-1].q[i]=0;
num[h-1][i].q[temp]=0;
num[i][l-1].q[temp]=0;
//记录已知项的后一项的位置
if(l!
=9)
b=h-1;
c=l;
else
b=h;
c=0;
//重新标记已知项后一项的标记
for(i=h-1;
i>
=0;
i--)
for(j=a-1;
j>
j--)
if(num[i][j].q[0]==0)
num[b][c].H=i;
num[b][c].L=j;
temp=0;
if(temp==0)
{break;
a=9;
voiddisplay1()//用于显示题目
for(k=0;
cout<
NUM[i][k];
if((k+1)%3==0)
{cout<
'
|'
cout<
\n'
if((i+1)%3==0)
/*cout<
cout<
i++)//用于查看数据
num[i][k].q[0]<
("
num[i][k].H<
"
num[i][k].L<
)"
}*/
flush;
getch();
voiddisplay2()
ji(0,0,1);
voidrealdisplay()//用于显示答案
num[i][j].q[0];
if((j+1)%3==0)
|"
main();
voidji(inta,intb,intc)
inttemp1=b,temp2=c,sign=0;
intnineh,ninel,ninei,ninej;
//记录九宫格的行列、循环
for(i=a;
for(j=temp1;
if(num[i][j].q[0]==0)//循环判断出该位是否有数字
for(k=temp2;
{
if(num[i][j].q[k]!
=0)
{
num[i][j].q[0]=k;
sign=1;
for(z=0;
z<
z++)
{
if(num[i][j].q[0]==num[i][z].q[0]&
&
z!
=j)//与同列比较
{
k=k+1;
num[i][j].q[0]=0;
sign=0;
ji(i,j,k);
}
if(z!
=i&
num[i][j].q[0]==num[z][j].q[0])//与同行比较
nineh=i-(i%3);
ninel=j-(j%3);
//获取该九宫格第一个空格的坐标
for(ninei=0;
ninei<
3;
ninei++)//用于判断九宫格内
for(ninej=0;
ninej<
ninej++)
{
if(num[nineh+ninei][ninel+ninej].q[0]==num[i][j].q[0]&
nineh+ninei!
=i&
ninel+ninej!
=j)
{
k=k+1;
num[i][j].q[0]=0;
ji(i,j,k);
}
}
}
break;
}
}
if(sign==1)
if(j!
=8)
{ji(i,j+1,1);
else
{ji(i+1,0,1);
//回到前项空格计算
if(num[i][j].H<
0)
{failfind();
}//无解
k=num[num[i][j].H][num[i][j].L].q[0]+1;
num[num[i][j].H][num[i][j].L].q[0]=0;
ji(num[i][j].H,num[i][j].L,k);
temp2=1;
temp1=0;
temp2=1;
realdisplay();
voidfailfind()
无解"
截图:
菜单:
输入:
显示题目:
显示答案: