高级软件工程第二次作业:随机生成N个不重复的已解答完毕的数独棋盘
#include <stdio.h>
#include "SuduCheck.h"
int SuduCheck(int temp[][],int i,int j,int k) //判断是否可以将第i行、第j列的数设为k
{
int m,n;
//判断行
for(n=;n<;n++)
{
if(temp[i][n]==k)
return ;
}
//判断列
for(m=;m<;m++)
{
if(temp[m][j]==k)
return ;
}
//判断所在小九宫格
int t1=(i/)*,t2=(j/)*;
for(m=t1;m<t1+;m++)
{
for(n=t2;n<t2+;n++)
{
if(temp[m][n]==k)
return ;
}
}
//可行,返回true
return ;
}
SuduCheck()函数可以对数据进行判断,判断是否符合数独数列的规则。判断同一行有无从复数字,判断同一列有无从复数字,判断同一宫有无重复数字。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include "SuduInput.h"
#include "SuduCheck.h"
#include "SuduGain.h"
void cleanup(int temp[][])
{
int i,j;
for(i=;i<;i++)
{
for(j=;j<;j++)
{
temp[i][j]=;
}
}
} int SuduGain(int temp[][])
{
int i,j,m,n,random=; //初始值第一个随机数是我学号最后一位,201810775001
//srand((unsigned)time(NULL)); //随机数据初始化
for(i=;i<;i++) //循环每一行
{
for(j=;j<;j++) //循环每一列
{
m=;
while(SuduCheck(temp,i,j,random)==) //判断此随机数是否能够使用,如果能够使用跳出循环,否则继续循环
{
random=rand()%+; //生成一个0-9的随机数
m++;
if(m>) //如果同一个位置循环100次失败,判断此数独行失败,返回从新开始
{
return ;//此数独数列失败,从新开始
}
}
temp[i][j]=random;//此数已经通过检查,可以放入数组
//SuduInput(temp);
//printf("m=%d n=%d\trandom=%d\n",m,n,random);
//getch();
}
}
return ; //数独列表生成成功
}
SuduGain()函数形成数独数列,随机生成0-9任意数据,如果符合数独数列要求就加入数独数列之中。如果随机的数据100次都不符合要求,则判断此数独数列失败,否则就能够成功。
#include <stdio.h>
#include <stdlib.h>
#include "SuduInput.h"
void SuduInput(int temp[][])
{
int i,j;
FILE *fp;
//数独输出到屏幕
for(i=;i<;i++)
{
for(j=;j<;j++)
{
printf("%d",temp[i][j]);
}
printf("\n");
}
printf("\n");
//数独输出到文档
if((fp = fopen("sudotiku.txt", "a+")) == NULL)
{
printf("Can,t opent file!");
exit();
}
for(i=;i<;i++)
{
for(j=;j<;j++)
{
fprintf(fp,"%d ",temp[i][j]);
}
fprintf(fp,"\n");
}
fprintf(fp,"\n");
fclose(fp);
}
SuduInput()输出数独数列数组在屏幕上和sudotiku.txt文本当中。
#include <stdio.h>
#include <stdlib.h>
#include "SuduInput.h"
#include "SuduCheck.h"
#include "SuduGain.h"
int sudo[][]={};
int main(int argc, char *argv[])
{
int i,n;
n=atof(argv[]); //输入需要数独数据个数
for(i=;i<n;i++) //循环获得数独
{
do
{
cleanup(sudo); //清理数组
}while(SuduGain(sudo)==); //如果数独生成失败,返回结果为0,则清空sudo数组,继续再试直到成功
SuduInput(sudo);
}
return ;
}
main()函数中获得需要随机的数独个数,调用SuduGain()函数生成数独数列,如果成功就进行下一次生成,直到完全题目要求。
使用C语言编译器编译生成对应的sudotiku.exe 。在window 命令中调用sudotiku.exe,输入sudotiku.exe -c 3 即可获得以下数据在同一目录下的sudotiku.txt文件当中。
1 2 6 5 4 8 7 9 3
3 4 9 1 6 7 2 5 8
8 7 5 9 2 3 1 4 6
6 8 7 4 5 9 3 2 1
2 5 4 3 7 1 6 8 9
9 3 1 2 8 6 4 7 5
5 1 2 6 9 4 8 3 7
7 9 3 8 1 2 5 6 4
4 6 8 7 3 5 9 1 2
1 2 3 5 7 9 4 6 8
8 7 5 6 4 3 2 9 1
4 6 9 2 8 1 7 5 3
3 4 8 9 1 5 6 2 7
7 9 6 8 2 4 1 3 5
5 1 2 3 6 7 8 4 9
9 8 4 1 3 2 5 7 6
6 3 7 4 5 8 9 1 2
2 5 1 7 9 6 3 8 4
1 8 3 5 2 4 6 9 7
7 5 9 8 6 3 4 2 1
2 4 6 1 9 7 3 8 5
5 6 7 9 3 1 2 4 8
8 2 1 4 5 6 7 3 9
9 3 4 2 7 8 1 5 6
6 7 2 3 8 9 5 1 4
4 9 5 7 1 2 8 6 3
3 1 8 6 4 5 9 7 2
分析:程序能够正确的生成多个数独数列,完整加入.h文件代码在https://git.coding.net/longjiangteng/sudoti.git中可以查看。但是代码效率很低,使用生成方法过于简单,需要计算机大量的运算尝试。随机函数rand()并不能做到真随机,多次生成的数独数列会有重复。还是具有持续改进的余地。
心得:使用C语言编写数独程序非常复杂,提高效率的算法我一直没有能够理解,这就是我遇到的问题。只能花费多个晚上使用了一个最笨的办法完成了作业,感到非常的惭愧。
课外任务作业:
你已经具备的专业知识、技能、能力有哪些?
目前为止已经掌握一些技能和专业知识,熟悉使用C语言编程,了解掌握Python语言。熟悉单片机系统,底层硬件驱动。
离成为一个合格的 IT专业毕业生,在专业知识、技能、能力上还差距哪些?
合格专业的IT毕业生,对于代码量和算法需要掌握,特别是数据结构和算法等知识。还需要掌握一门熟练的高级语言,能够使用高级语言进行开发。
请看这个技能调查表, 从表中抽取 5 - 7 项你认为对你特别重要的技能,记下目前的水平, 和你想在课程结束后达到的水平?
技能调查表中的技能我觉得都挺重要,很多技能希望能够在学校系统的进行学习提高。现在是我自认为的水平,就看我以后的学习了!
高级软件工程第二次作业:随机生成N个不重复的已解答完毕的数独棋盘的更多相关文章
- 结对作业——随机生成四则运算(Core 第7组)
结对作业 ——随机生成四则运算(core第7组) 吕佳玲 PB16060145 涂涵越 PB16060282 GITHUB地址 https://github.com/hytu99/homework_2 ...
- c#部分---网吧充值系统;简易的闹钟;出租车计费;简单计算器;对战游戏;等额本金法计算贷款还款利息等;随机生成10个不重复的50以内的整数;推箱子;
网吧充值系统namespace ConsoleApplication1 { class Program { struct huiyuan { public string name; public st ...
- Java数组实现随机生成N-M之间不重复的随机数
接收一个整形数组,使用Math.Random每次在规定的数字范围内随机产生数字,然后嵌套for循环依次判断是否有重复值,如果有既外循环变量减一,直到把数组装满为止. /** * 随机生成 N--M的不 ...
- C#声明一个100大小的数组 随机生成1-100之间不重复的数
面试题:C#声明一个100大小的数组 随机生成1-100之间不重复的数下面是C#的实现方式,编译测试通过 public static void InsertRandomArray() { int[] ...
- 17秋 软件工程 第二次作业 sudoku
2017年秋季 软件工程 作业2:个人项目 sudoku Github Project Github Project at Wasdns/sudoku. PSP Table PSP2.1 Person ...
- 集大1513 & 1514班 软件工程第二次作业评分与点评
谢谢按时完成作业的同学. 请大家在今后的作业中多思考,认真完成并注意作业的原创性. 学号 作业标题 作业地址 提交日期 分数 201521121087 微信APP简要分析 http://www.cnb ...
- 软件工程 - 第二十次作业 Alpha 事后诸葛亮(团队)
Alpha 事后诸葛亮(团队) 组长本次作业链接:https://www.cnblogs.com/dawnduck/p/10056026.html 现代软件工程 项目Postmortem 设想和目标 ...
- 软件工程第二次作业——git的使用
1. 参照 http://www.cnblogs.com/xinz/p/3803109.html 的第一题,每人建立一个GitHub账号,组长建立一个Project,将本组成员纳入此Porject中的 ...
- 【软件工程第二次作业】个人项目:WordCountPy
一.GitHub 地址 项目 GitHub 地址为:https://github.com/bytemo/WordCountTool 二.PSP表格 PSP2.1 Personal Software P ...
随机推荐
- SQL 中的正则函数
ORACLE中支持正则表达式的函数主要有下面四个: 1,REGEXP_LIKE :与LIKE的功能相似,比LIKE强大得多. 2,REGEXP_INSTR :与INSTR的功能相似. 3,REGEXP ...
- 07-js数据类型
# JavaScript 基本数据类型 typeof函数获取一个变量的类型: ```angularjs* boolean - 如果变量是 Boolean 类型的* number - 如果变量是 Num ...
- ABBYY FineReader 14.0.107.232 Enterprise 下载和安装使用
目录 1. 按 2. 软件功能 3. 软件特色 4. 安装说明 5. 激活说明 6. 下载地址 1. 按 ABBYY FineReader 是款功能强大的OCR文字识别软件:它支持者用户进行使用文档的 ...
- 基于Xilinx Kintex-7 XC7K325T 的FMC USB3.0 SATA 四路光纤数据转发卡
基于Xilinx Kintex-7 XC7K325T 的FMC USB3.0 SATA 四路光纤数据转发卡 1. 板卡概述 本板卡基于Xilinx公司的FPGAXC7K325T-2FFG900 芯片, ...
- git的HEAD指针操作
学习操作HEAD指针,具体如下: - 查看Git版本信息 - 移动指针 - 通过移动HEAD指针恢复数据 - 合并版本 拓扑图:
- 伪类和伪元素,review
总是分不太清楚,然后容易忘记这个概念,项目中又遇到了,复习一遍 问题 1.哪些常用的伪类?伪元素? 怎么记: 除了4个伪元素,其他都是伪类 哪四个伪元素?:before :after :first-l ...
- 什么是shader?
一.什么是shader? shader是一段GLSL(openGL着色语言)小程序,运行在GPU(图形处理器),而非CPU使用GLSL语言编写,看上去像c或c++,但却是另外一种不同的语言.使用sha ...
- 占卜DIY
题目地址 Code #include<iostream> #include<vector> #include<map> using namespace std; s ...
- Nginx-配置动静分离实例
Nginx 动静分离简单来说就是把动态跟静态请求分开,不能理解成只是单纯的把动态页面和静态页面物理分离.严格意义上说应该是动态请求跟静态请求分开,可以理解成使用Nginx 处理静态页面,Tomcat处 ...
- Task7.卷积神经网络
卷积定义: 所谓卷积,其实是一种数学运算.但是在我们的学习生涯中,往往它都是披上了一层外衣,使得我们经常知其然不知其所以然.比如在信号系统中,他是以一维卷积的形式出现描述系统脉冲响应.又比如在图像处理 ...