数独 顾云康E01114300.docx

上传人:b****6 文档编号:5377457 上传时间:2022-12-15 格式:DOCX 页数:14 大小:81.14KB
下载 相关 举报
数独 顾云康E01114300.docx_第1页
第1页 / 共14页
数独 顾云康E01114300.docx_第2页
第2页 / 共14页
数独 顾云康E01114300.docx_第3页
第3页 / 共14页
数独 顾云康E01114300.docx_第4页
第4页 / 共14页
数独 顾云康E01114300.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

数独 顾云康E01114300.docx

《数独 顾云康E01114300.docx》由会员分享,可在线阅读,更多相关《数独 顾云康E01114300.docx(14页珍藏版)》请在冰豆网上搜索。

数独 顾云康E01114300.docx

数独顾云康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;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);

}

/*检查是否完成*/

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

}

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

当前位置:首页 > 幼儿教育 > 少儿英语

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

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