c语言课程设计报告数独.docx
- 文档编号:30077477
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:20
- 大小:288.05KB
c语言课程设计报告数独.docx
《c语言课程设计报告数独.docx》由会员分享,可在线阅读,更多相关《c语言课程设计报告数独.docx(20页珍藏版)》请在冰豆网上搜索。
c语言课程设计报告数独
课程设计
数独解谜程序
2015年4月20日
一、
使用资料
C++中栈结构建立与操作
什么是栈结构
栈结构是从数据的运算来分类的,也就是说栈结构具有特殊的运算规则,即:
后进先出。
我们可以把栈理解成一个大仓库,放在仓库门口(栈顶)的货物会优先被取出,然后再取出里面的货物。
而从数据的逻辑结构来看,栈结构起始就是一种线性结构。
如果从数据的存储结构来进一步划分,栈结构包括两类:
顺序栈结构:
即使用一组地址连续的内存单元依次保存栈中的数据。
在程序中,可以定义一个指定大小的结构数组来作为栈,序号为0的元素就是栈低,再定义一个变量top保存栈顶的序号即可。
链式栈结构:
即使用链表的的形式保存栈中各元素的值。
链表首部(head指针所指向元素)为栈顶,链表尾部(指向地址为NULL)为栈底。
在栈结构中只能在一端进行操作,该操作端称为栈顶,另一端称为栈底。
也就是说,保存和取出的数据都只能从栈结构的一端进行。
从数据的运算角度来分析,栈结构是按照“后进先出”的原则处理结点数据的。
在栈结构中,只有栈顶元素是可以访问的,栈结构的数据运算也是非常简单。
一般栈结构的基本操作只有两个:
入栈(Push):
将数据保存到栈顶的操作。
进行入栈操作前,先修改栈顶指针,使其向上移一个元素位置,然后将数据保存到栈顶指针所指的位置。
出栈(Pop):
将栈顶数据弹出的操作。
通过修改栈顶指针,使其指向栈中的下一个元素。
接下来,我们使用C++语言建立顺序栈,并完成顺序栈结构的基本运算
准备数据
准备在栈操作中需要用到的变量及数据结构等。
#defineMAXLEN50
structDATA
{
stringname;
intage;
};
structStackType
{
DATAdata[MAXLEN+1];
inttop;
};
定义栈结构的长度MAXLEN,栈结构的数据元素类型DATA,以及栈结构的数据结构StackType。
在数据结构StackType中,data为数据元素,top为栈顶的序号。
当top=0时,表示栈为空,当top=MAXLEN时表示栈满。
数组元素都是充下标0开始的,这里为了讲述和理解方便,我们从下标1开始记录数据结点,下标0的位置不用。
初始化栈结构
在使用栈结构之前,首先需要创建一个空的顺序栈,也就是初始化顺序栈。
顺序栈的初始化操作如下:
(1)按照符号常量MAXLEN指定大小申请一片内存空间,用来保存栈中的数据
(2)设置栈顶指针的值为0,表示一个空栈。
示例代码如下:
StackType*STInit()
{
StackType*p;
if(p=newStackType) //申请栈空间
{
p->top=0; //设置栈顶为0
returnp; //返回栈顶指针
}
returnNULL;
}
首先用new申请内存,然后设置栈顶为0,然后返回申请内存的首地址,申请失败返回NULL;
判断空栈
判断栈结构是否为空,如果是空栈,则表示该栈结构中没有数据,此时可以进行入栈操作,但是不可以进行出栈操作。
示例代码如下:
intSTIsEmpty(StackType*s)
{
intt;
t=(s->top==0); //通过栈顶的值进行判断
returnt;
}
输入参数s为一个指向操作的栈的指针。
根据栈顶指针top判断是否为0,判断栈是否为空。
判断满栈
判断栈结构是否为满。
如果是满栈,则表示该栈结构中没有多余的空间来保存额外数据。
此时不可以进行入栈操作,但是可以进行进栈操作。
示例代码如下:
intSTIsFull(StackType*s)
{
intt;
t=(s->top==MAXLEN);
returnt;
}
输入参数s为一个指向操作的栈的指针。
根据栈顶指针top判断是否和MAXLEN相等,判断栈是否已满。
清空栈
清空栈就是栈中所有的数据被清除。
示例代码如下:
voidSTClear(StackType*s)
{
s->top=0;
}
将栈顶指针top设置为0,表示执行清空栈操作。
(这里只是逻辑上将栈中数据清空,实际上只是将top设置为0,以后再添加数据会覆盖原来的数据)
释放空间
释放空间是释放栈结构所占用的内存单元,使用delete释放用new运算符申请的内存空间。
示例代码如下:
voidSTFree(StackType*s)
{
deletes;
}
在程序中直接调用delete运算符释放已分配的内存空间。
一般在不需要使用栈结构时调用该函数,特别是在程序结束的时候。
入栈
入栈(Push)是栈结构的基本操作,主要操作是将数据元素保存到栈结构。
入栈操作的具体步骤如下:
(1)首先判断栈顶top,如果top大于等于MAXLEN,则表示溢出,进行出错处理。
否则执行以下操作。
(2)设置top=top+1(栈顶指针加1,指向入栈地址)
(3)将入栈呀U尿素保存到top指向的位置。
示例代码如下:
intPushST(StackType*s,DATAdata)
{
if((s->top+1)>MAXLEN)
{
cout<<"栈溢出"< return0; } s->data[++s->top]=data; //将元素压入栈 return1; } 输入参数s为一个指向操作的栈的指针,输入参数data是需要入栈的数据元素。 程序首先判断栈是否溢出,如果溢出就给出警告,不进行入栈操作,否则修改栈顶指针,即top先加1,然后将data放到top现在指向的数据单元。 出栈 出栈(Pop)是占据诶狗的基本操作,主要操作与入栈相反,它是从栈顶弹出一个数据元素,出栈操作的具体步骤如下: (1)首先判断栈顶top,如果top等于0,则表示为恐慌在哪,进行出错处理。 否则执行下面的操作。 (2)将栈顶指针top所指向的位置的元素返回(实际是返回的指针) (3)将top的减1,指向栈的下一个元素,原来栈顶的元素被弹出。 DATA*PopST(StackType*s) { if(s->top==0) { cout<<"栈为空,不能再输出! "< exit(0); } return&(s->data[s->top--]); } 当栈中有数据时,该函数返回值是一个指向DATA类型数据的指针。 读取点结构 读取点结构也就是读取栈结构中结点的数据。 由于栈结构只能在一端进行操作,因此这里的读操作其实就是读站点的数据。 需要注意的是,读节点数据的操作和出栈操作不同。 读结点操作仅仅是显示栈顶结点数据的内容,而出栈操作则将栈顶数据弹出。 示例代码如下: DATA*PeekST(StackType*s) { if(s->top==0) { cout<<"栈已空"< exit(0); } return&(s->data[s->top]); } 对比出栈的示例代码,不难发现读取点结构同样返回了栈顶结点的地址,但是却没有使top减1. 二、设计内容 1、开发一款“数独”计算程序 规则: 将数字1-9放置在每个小格里,使得每一行、没一列、每一个3*3的方框里都没有重复的数字即可。 要求: (1)、自行输入数独表格中数字 (2)、组成数独网格 (3)、依次填入数字1-9检查约束条件 (4)、输出符合约束条件的结果 三、详细设计说明 1.数独小游戏说明 数独游戏在9×9的方格内进行,分为3×3的小方格,被称为“区”: 区数独游戏的目的是根据下列规则,用1至9之间的数字填满空格,一个格子只能填入一个数字。 每个数字在每一行只能出现一次。 每个数字在每一列只能出现一次。 每个数字在每一区只能出现一次 2.数独程序流程图 四、软件使用说明 工具: vc++6.0; 输入数据 运行结果 五、附录: 部分程序清单(带有较详细的注释) #include /*数字0表示该位置为空,待填入数字 {0,0,4,6,0,2,0,9,1}, {2,1,0,9,8,4,0,5,6}, {9,0,0,0,7,1,4,2,0}, {1,2,5,0,6,0,3,4,7}, {4,7,6,0,0,0,9,8,5}, {8,3,9,0,4,0,1,6,2}, {0,9,1,2,5,0,0,0,4}, {5,8,0,4,1,6,0,3,9}, {6,4,0,3,0,7,5,0,0}}; */ intdata[9][9]={ {0,7,0,2,6,0,9,0,0}, {3,0,0,0,0,8,0,0,7}, {0,9,0,0,5,7,0,0,0}, {5,0,0,0,0,0,0,7,0}, {0,4,7,3,1,2,8,5,0}, {0,8,0,0,0,0,0,0,1}, {0,0,0,8,2,0,0,4,0}, {7,0,0,6,0,0,0,0,2}, {0,0,4,0,3,9,0,8,0}}; voidinput() { 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"); } /*检查num是否可放置在3*3区域是否有冲突*/ intCheckSquare(intline,intcol,intnum) { inti=(line/3)*3; intj=(col/3)*3; intm,n; for(m=i;m for(n=j;n if((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); } /*检查是否完成*/ intIsDone() { 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; } voidCalc() { inti,j,x; if(IsDone()) { output(); 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; } } } } } intmain() { //input(); Calc(); output(); return0; } 设计 题目 数独解谜程序 成绩 课 程 设 计 主 要 内 容 数独游戏在9×9的方格内进行,分为3×3的小方格,被称为“区”: 区数独游戏的目的是根据下列规则,用1至9之间的数字填满空格,一个格子只能填入一个数字。 每个数字在每一行只能出现一次。 每个数字在每一列只能出现一次。 每个数字在每一区只能出现一次。 运用动态数组反复尝试所有可能数字,循环打印并计算,输出所有可行解。 指 导 老 师 评 语 签名: 20年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 课程设计 报告