数独解题系统.docx

上传人:b****5 文档编号:7660255 上传时间:2023-01-25 格式:DOCX 页数:13 大小:31.82KB
下载 相关 举报
数独解题系统.docx_第1页
第1页 / 共13页
数独解题系统.docx_第2页
第2页 / 共13页
数独解题系统.docx_第3页
第3页 / 共13页
数独解题系统.docx_第4页
第4页 / 共13页
数独解题系统.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

数独解题系统.docx

《数独解题系统.docx》由会员分享,可在线阅读,更多相关《数独解题系统.docx(13页珍藏版)》请在冰豆网上搜索。

数独解题系统.docx

数独解题系统

数独解题系统

源码:

/************************************************************

*2011.01.24*

*数独解题系统*

*未测试版*

*2010.02.09*

*第一次测试*

*改变内容:

*

*1.增加了九宫格内数据不重复的判别*

*2.改进了输入方式较之前的输入方式方便*

*问题描述:

*

*题目输出有有问题NUM经过input后显示错误但解题正确*

**

*作者:

杨劼*

************************************************************/

#include

#include//清屏

#include

typedefstruct

{

intq[10];

intH,L;//用于标记前位空位

}Num;

Numnum[9][9];

intNUM[9][9];//用于储存显示题目

inti,j,k,z;//用于循环

inth,l,n;//

inttemp;//用于暂存数据

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";

cout<<"\t\t数独系统\n";

cout<<"\t\t======================================";

cout<<"\n\n";

cout<<"\t\t【1】初始化系统\n";

cout<<"\t\t【2】按要求输入题目\n";

cout<<"\t\t【3】显示题目\n";

cout<<"\t\t【4】显示答案\n";

cout<<"\n";

cout<<"\t\t【0】退出本系统\n";

cout<<"\n\t注:

每次输入题目前需初始化系统显示过答案后题目显示会出错\n\n";

cout<<"\t\t请选择:

"<

choice=getch();

system("cls");

switch(choice)

{

case'1':

chushi();//用于初始化

break;

case'2':

putin();

//input();//用于输入数据

break;

case'3':

display1();//用于显示题目

break;

case'4':

display2();//显示答案

break;

case'0':

exit(0);

}

}

}

voidchushi()//初始化数据

{

for(i=0;i<9;i++)

{

for(j=0;j<9;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<9;a++)

{

for(b=0;b<9;b++)

{

cin>>NUM[a][b];

if(NUM[a][b]!

=0)

{

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;i<10;i++)

{

num[h-1][l-1].q[i]=0;

}

for(i=0;i<9;i++)

{

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>=0;j--)

{

if(num[i][j].q[0]==0)

{

num[b][c].H=i;

num[b][c].L=j;

temp=0;

break;

}

}

if(temp==0)

{break;}

a=9;

}

}

voiddisplay1()//用于显示题目

{

for(i=0;i<9;i++)

{

for(k=0;k<9;k++)

{

cout<

if((k+1)%3==0)

{cout<<"";}

else

{cout<<'|';}

}

cout<<'\n';

if((i+1)%3==0)

cout<<"\n";

}

/*cout<<"\n";cout<<"\n";cout<<"\n";

for(i=0;i<9;i++)//用于查看数据

{

for(k=0;k<9;k++)

{

cout<

if((k+1)%3==0)

{cout<<"";}

else

{cout<<'|';}

}

cout<<'\n';

if((i+1)%3==0)

cout<<"\n";

}*/

cout<

getch();

}

voiddisplay2()

{

ji(0,0,1);

}

voidrealdisplay()//用于显示答案

{

for(i=0;i<9;i++)

{

for(j=0;j<9;j++)

{

cout<

if((j+1)%3==0)

{cout<<"";}

else

{cout<<"|";}

}

cout<<'\n';

if((i+1)%3==0)

cout<<"\n";

}

cout<

getch();

main();

}

voidji(inta,intb,intc)

{

inttemp1=b,temp2=c,sign=0;

intnineh,ninel,ninei,ninej;//记录九宫格的行列、循环

for(i=a;i<9;i++)

{

for(j=temp1;j<9;j++)

{

if(num[i][j].q[0]==0)//循环判断出该位是否有数字

{

for(k=temp2;k<10;k++)

{

if(num[i][j].q[k]!

=0)

{

num[i][j].q[0]=k;sign=1;

for(z=0;z<9;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])//与同行比较

{

k=k+1;

num[i][j].q[0]=0;sign=0;

ji(i,j,k);

}

nineh=i-(i%3);ninel=j-(j%3);//获取该九宫格第一个空格的坐标

for(ninei=0;ninei<3;ninei++)//用于判断九宫格内

{

for(ninej=0;ninej<3;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;sign=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()

{

cout<<"无解";

cout<

getch();

main();

}

截图:

菜单:

输入:

显示题目:

显示答案:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1