数独解题系统.docx
《数独解题系统.docx》由会员分享,可在线阅读,更多相关《数独解题系统.docx(13页珍藏版)》请在冰豆网上搜索。
数独解题系统
数独解题系统
源码:
/************************************************************
*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();
}
截图:
菜单:
输入:
显示题目:
显示答案: