数独 顾云康E01114300.docx
《数独 顾云康E01114300.docx》由会员分享,可在线阅读,更多相关《数独 顾云康E01114300.docx(14页珍藏版)》请在冰豆网上搜索。
数独顾云康E01114300
数据结构课程设计实验报告
数独
姓名:
顾云康
学号:
E1114300
指导老师:
王爱平
日期:
2013.10.8
目录
1课程设计的目的2
2需求分析2
3课程设计报告内容2
3.1概要设计2
3.2详细设计3
3.3调试分析6
4总结7
5程序清单7
6参考文献7
7程序运行结果8
附录9
1课程设计的目的
(1)熟练使用C语言编写程序,解决实际问题;
(2)了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;
(3)初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法
和技能;
(4)提高综合运用所学的理论知识和方法独立分析和解决问题的能力;
2需求分析
(1)设置二维数组来存放数独
(2)编写数独的输入、输出函数
(3)编写检查数独中任一位置是否可填相应数字的函数
(4)编写数独求解函数
(5)编写随机生成待解数独的函数
(6)编写主函数,控制程序运行
3课程设计报告内容
3.1概要设计
(1)使用整型二维数组来存放数独,初始值全部赋为0,
intdata[9][9]={
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0}};
(2)主函数流程
首先选择数独的输入方式,1为随机生成一个待解数独,2为人工输入一个待解数独。
输入功能选择后即可求解数独。
(3)求解数独的函数:
使用递归的方法求解数独,递归函数设置两个出口,一是构造数独成功时即退出递归,二是递归结束后仍然未解出数独。
(4)生成数独的函数:
生成待解数独的方法是首先使用循环随机生成一个一定有解的待解数独,然后再在任意处补零,构成待解数独。
3.2详细设计
(1)主函数:
voidmain(intargc,char*argv[])
{
intfunction;
printf("*******************欢迎进行数独游戏:
********************\n1、随机生成待解数独\n2、手工输入待解数独(未填处请填写0)\n*********************************************************\n");
scanf("%d",&function);
if(function==1)
{
creat();
printf("您输入的9*9矩阵为:
\n");
for(intw=0;w<30;w++)
{
inti=rand()%9;
intj=rand()%9;
temp[i][j]=0;
}
output1();
printf("求解出的数独答案为:
\n");
output2();
}
elseif(function==2)
{
input();
Calc();
output2();
}
else
{
printf("输入不合法!
\n");
}
intzz;
scanf("%d",&zz);
}
(2)递归求解数独函数:
voidCalc()
{
if(flag)
{
return;
}
inti,j,x;
if(isok())//成功构造数独时递归调用的出口
{
for(intpp=0;pp<9;pp++)
{
for(intqq=0;qq<9;qq++)
{
temp[pp][qq]=data[pp][qq];
res[pp][qq]=data[pp][qq];
}
}
zzz=zzz+1;
if(zzz==1)
{
flag=true;
}
return;
}
for(i=0;i<9;i++)//通过三重循环给每个位置元素赋值
{
for(j=0;j<9;j++)
{
if(data[i][j]==0)
{
for(x=1;x<=9;x++)
{
if(Check(i,j,x))
{
data[i][j]=x;
Calc();
}
}
if(x==10)
{
data[i][j]=0;
return;//数独构造失败时递归的出口
}
}
}
}
}
(3)随机建立待解数独函数:
intPush(SqStack&S,chare)
{
if(S.top-S.base>=S.stacksize)//栈满,追加储存空间
{
S.base=((char*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char)));
if(!
S.base)exit(0);++++++++++
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
return1;
}
3.3调试分析
运行截图
4总结
通过这次课程设计我主要了解了递归函数的使用,了解了数独游戏的规则及求解方法,掌握了利用计算机求解数独的技巧。
成功解决求解数独的问题,使我对数据结构的学习有了更进一步的理解。
在完成本次课程设计中,我发现很多理论性知识在实际使用时与单纯的理论还是有所差别的,今后我会更加注重培养自己的实践动手能力。
5程序清单
见附录
6参考文献
[1]严蔚敏,吴伟民编著.数据结构(C语言版)--北京:
清华大学出版社,2007.
[2]严蔚敏,吴伟民米宁编著.数据结构题集(C语言版)--北京:
清华大学出版社,2007.
7程序运行结果
附录
程序清单:
#include"stdafx.h"
#include
#include
intdata[9][9]=inttemp[9][9]=intres[9][9]={
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0}};
voidinput()
{
printf("请以行序为主序输入9*9的矩阵(没有数字处填0)\n");
inti,j;
for(i=0;i<9;i++)
for(j=0;j<9;j++)
scanf("%d",&data[i][j]);
}
voidoutput()
{
inti,j;
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
printf("%d",data[i][j]);
printf("\n");
}
printf("\n");
}
voidoutput1()
{
inti,j;
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
printf("%d",temp[i][j]);
printf("\n");
}
printf("\n");
}
voidoutput2()
{
inti,j;
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
printf("%d",res[i][j]);
printf("\n");
}
printf("\n");
}
/*检查num是否可放置在3*3区域是否有冲突*/
intCheckSquare(intline,intcol,intnum)
{
inti=(line/3)*3;
intj=(col/3)*3;
intm,n;
for(m=i;m
for(n=j;nif((data[m][n]==num)&&!
(m==line&&n==col))
return0;
return1;
}
/*检查行冲突*/
intCheckLine(intline,intcol,intnum)
{
inti=9;
while(i--)
if((data[line][i]==num)&&(i!
=col))
return0;
return1;
}
/*检查列冲突*/
intCheckColumn(intline,intcol,intnum)
{
inti=9;
while(i--)
if((data[i][col]==num)&&(i!
=line))
return0;
return1;
}
/*检查i行j列是否可放置num*/
intCheck(inti,intj,intnum)
{
returnCheckSquare(i,j,num)&&CheckLine(i,j,num)&&CheckColumn(i,j,num);
}
/*检查是否完成*/
intisok()
{
inti,j;
for(i=0;i<9;i++)
for(j=0;j<9;j++)
if(!
Check(i,j,data[i][j])||(data[i][j]==0))
return0;
return1;
}
intzzz=0;
boolflag=false;
voidCalc()
{
if(flag)
{
return;
}
inti,j,x;
if(isok())//成功构造数独时递归调用的出口
{
for(intpp=0;pp<9;pp++)
{
for(intqq=0;qq<9;qq++)
{
temp[pp][qq]=data[pp][qq];
res[pp][qq]=data[pp][qq];
}
}
zzz=zzz+1;
if(zzz==1)
{
flag=true;
}
return;
}
for(i=0;i<9;i++)//通过三重循环给每个位置元素赋值
{
for(j=0;j<9;j++)
{
if(data[i][j]==0)
{
for(x=1;x<=9;x++)
{
if(Check(i,j,x))
{
data[i][j]=x;
Calc();
}
}
if(x==10)
{
data[i][j]=0;
return;//数独构造失败时递归的出口
}
}
}
}
}
voidcreat()
{
srand(time(0));
do
{
for(inti=0;i<9;++i)
{
for(intj=0;j<9;++j)
{
data[i][j]=0;
}
j=rand()%9;//随机一列
data[i][j]=i+1;//随机排列1-9
}
Calc();
if(zzz==1)
{
break;
}
}while
(1);
}
voidmain(intargc,char*argv[])
{
intfunction;
printf("*******************欢迎进行数独游戏:
********************\n1、随机生成待解数独\n2、手工输入待解数独(未填处请填写0)\n*********************************************************\n");
scanf("%d",&function);
if(function==1)
{
creat();
printf("您输入的9*9矩阵为:
\n");
for(intw=0;w<30;w++)
{
inti=rand()%9;
intj=rand()%9;
temp[i][j]=0;
}
output1();
printf("求解出的数独答案为:
\n");
output2();
}
elseif(function==2)
{
input();
Calc();
output2();
}
else
{
printf("输入不合法!
\n");
}
intzz;
scanf("%d",&zz);
}