数独结对项目ohazyi

数独的空格自由度,指除掉空格本身,空格所在行、列、九宫内的空格数总和。

因此,当只剩一个空格时,此时的自由度为0;当数独全为时,空格数为81,空间自由度为81*24=1944达到最大。

自由度越大代表数独越难,但自由度和空格数不完全程正比。因此那篇博主进行了自由度的阶段区分,并在后文中验证了模型的合理性。

我们关于自由度的定义和他略有不同,主要在于他在算同一行同一列的自由度时,算入了自己。而我们没有。他最终分了10个等级,我们要求的是3个。因此我们最终的难度设定如下:

流程图如下:

具体的Core类的所有函数即功能如下:

例如我测试求解一个数独是不是有唯一解这个函数,我就通过来填入一个有多个解的数独来进行求解其解数,来进行判断。之后我也对有唯一解的数独进行了测试。

TEST_METHOD(TestMethod7){//testsolve_uniqueCores;intppp[M]={6,1,0,3,0,0,0,0,9,0,4,0,7,0,0,0,2,0,0,8,9,1,2,0,0,0,0,0,2,3,0,0,7,0,9,0,4,5,6,0,9,1,2,3,7,0,0,7,0,0,3,0,5,0,0,0,0,0,0,8,0,6,0,5,6,0,0,0,0,0,0,3,9,0,0,6,3,0,0,0,0};intuni=s.solve_unique(ppp);s.out=fopen("unit_out_7.txt","w");fprintf(s.out,"%d\n",uni);Assert::AreEqual((uni>1),true);}测试的原函数代码如下:

intCore::solve_unique(inttmp[M]){hasAnswer=0;//falsememcpy(x,tmp,sizeof(x));memset(a,0,sizeof(a));rep(i,0,80){if(x[i]>0)modifyElement(i,x[i]);}dfs2(1,0);returnhasAnswer;}再例如测试-n-r,并且r1>r2的例子,我是通过在generate里捕获异常把一个布尔变量hasException置为true来判断的:

TEST_METHOD(TestMethod10){//Test-nwith-rCores;s.generate(1,50,40,true,lll);Assert::AreEqual(s.hasException,true);}而我的generate函数的代码如下:

voidCore::generate(intnumber,intlower,intupper,boolunique,intresult[][M]){try{if(number<1||number>10000){throwexception("-nnumbershouldbein[1,10000]");}if(lower<20||upper>55){throwexception("loweranduppershouldbein[20,55]");}if(lower>upper){throwexception("lowercannotbebiggerthanupper");}init_gen(50000,0);generate_single(number,lower,upper-lower+1,0,9999,unique,result);}catch(constexception&e){hasException=true;puts(e.what());}}单元测试覆盖率截图一共测试了20个例子,最终总的覆盖率为94%,主要的函数实现的cpp文件达到了98%,如下图:

我主要采用了在函数里直接catch住异常并打印错误信息到控制台的方法。常见的代码如下:

try{if(situation...){throwexception("...........");}catch(constexception&e){hasException=true;puts(e.what());}}现选取sudoku.cpp中捕获异常的情形和单元测试的例子如下表:

令选取主程序中捕获异常的情形和单元测试的例子如下表:

核心代码如下:

voidsudokuGUI::sudokuButtonClicked(){QPushButton*btn=qobject_cast(sender());inttemp=btn->objectName().toInt();intj=temp%10;inti=temp/10;if(empty[i][j]==0)return;if(btnTarget!=NULL){inttemp=btnTarget->objectName().toInt();intj=temp%10;inti=temp/10;setRowStyleSheet(i,btnNotEmptyStyle,0);setColumnStyleSheet(j,btnNotEmptyStyle,0);setJiugongStyleSheet(i,j,btnNotEmptyStyle,0);setRowStyleSheet(i,btnEmptyStyle,1);setColumnStyleSheet(j,btnEmptyStyle,1);setJiugongStyleSheet(i,j,btnEmptyStyle,1);btnTarget->setStyleSheet(btnEmptyStyle);}btnTarget=btn;setRowStyleSheet(i,btnNumberStyle,0);setColumnStyleSheet(j,btnNumberStyle,0);setJiugongStyleSheet(i,j,btnNumberStyle,0);setRowStyleSheet(i,btnNumberStyle,1);setColumnStyleSheet(j,btnNumberStyle,1);setJiugongStyleSheet(i,j,btnNumberStyle,1);btnTarget->setStyleSheet(btnTargetStyle);}数独矩阵上按钮对点击事件的相应

voidsudokuGUI::update(){for(inti=0;ifinishTime)res[difficultyChosen]=to_string(finishTime);writeRecordFile(res);}else{result.setText("Wrong!");}QMessageBox::about(&gameWindow,"Result",result.text());}检查用户提交答案的正确性

voidsudokuGUI::setBtnZoomAction(QPushButton&btn){QObject::connect(&btn,SIGNAL(pressed()),this,SLOT(setBtnZoomOut()));QObject::connect(&btn,SIGNAL(released()),this,SLOT(setBtnZoomIn()));}voidsudokuGUI::setBtnZoomOut(){QPushButton*btn=qobject_cast(sender());intcx=btn->x()+btn->width()/2;intcy=btn->y()+btn->height()/2;intnw=btn->width()*ZOOM_OUT_RATIO;intnh=btn->height()*ZOOM_OUT_RATIO;btn->setGeometry(cx-nw/2,cy-nh/2,nw,nh);QFontf=btn->font();f.setPixelSize(f.pixelSize()+2);btn->setFont(f);}voidsudokuGUI::setBtnZoomIn(){QPushButton*btn=qobject_cast(sender());intcx=btn->x()+btn->width()/2;intcy=btn->y()+btn->height()/2;intnw=btn->width()/ZOOM_OUT_RATIO;intnh=btn->height()/ZOOM_OUT_RATIO;btn->setGeometry(cx-nw/2,cy-nh/2,nw,nh);QFontf=btn->font();f.setPixelSize(f.pixelSize()-2);btn->setFont(f);}为按钮添加缩放动画

实现对接的代码,调用generate生成数独初局:

voidsudokuGUI::initMatrix(){intres[1][M]={0};core.generate(1,difficultyChosen+1,res);for(inti=0;i

boolok=core.solve(puzzle,solution);if(ok){btnTarget->setText(QString::number(solution[i*matrixLen+j],10));}else{QMessageBox::critical(&gameWindow,"warning","Nosolution!");}第四阶段互测我们是三个小组进行互相测试的,我测试的是15061186安万贺,测试我们的是由15061187窦鑫泽来完成的。

首先我们测试安万贺小组的情况如下,我们先把他们的Core.dll和Core.lib拷贝到了我们的sudokuGUI工程下进行测试,发现他们的生成有这样的问题,就是不管怎么开始,终盘的第一行总是1..9,即如下效果:

然后我就给他们提出了issue,后来通过交流发现他们的随机化放在了GUI里而不是generate里进行随机,因此导致我们用的时候总是1..9。

另外是关于命令行的调用。我发现不管是调用generate(1,1,53,false,a);还是c.generate(1,54,53,false,a);或者c.generate(1,20,500000,false,a);

反馈的错误都是:

Thenumberafter-risnotintherange.

然后我希望能够他们区分这些错误,就提了issue.

一个可能的测试代码如下:

try{Corec;c.generate(1,20,5000,false,a);}catch(NumberOutOfBoundException&e){cout<

如果solve函数的puzzle函数是一个本身就非法的数独,例如一行有两个数是一样的情况,没有捕捉到异常或者返回false,而是也求了一个解。

一个可能的测试代码如下.这个矩阵的第一行有两个9,显然是无解的:

intpuzzle[81]={0,0,0,0,0,5,9,0,9,3,0,5,0,0,9,0,0,6,7,8,0,0,2,0,0,0,0,1,0,0,4,0,7,6,0,0,4,5,0,0,0,1,0,0,7,8,0,0,0,0,3,0,0,0,0,0,1,0,7,0,5,0,4,0,6,4,0,0,2,8,7,3,5,7,8,6,3,4,9,1,2};intsolution[81];Corec;c.solve(puzzle,solution);rep(j,0,80){cout<

612345989345789126789126345123457698456891237897263451231978564964512873578634912然后是别人给我们的测试进行的修正。最初始的改正就是把generate的数组的参数从83改成了81,即宏定义的M值。(之前写成83是害怕溢出)因为发现如果参数不同是无法调用别人的函数的。

根据窦哥给我们组的issue如下,是几个比较中肯与实际的测试问题:

然后第三点,关于sudoku.exe-cabc,其中abc是个不存在的文件,此时我们的是不能识别这个异常的。相当于直接闷声过去了。然后增加的修改如下:

FILE*fp=NULL;fp=fopen(argv[2],"r");if(fp==NULL){throwstd::exception("-sfiledoesn'texist");}用fopen判断是不是NULL就可以增加捕捉了这个异常。

用户的反馈:用户1:按钮有动态效果,界面很好看。用户2:支持键盘输入数字,很方便。用户3:NoSolution的意义不是很明确。用户4:成功求解数独弹出right之后点击ok能返回主界面就好了。用户5:没有音效。用户6:没有暂停功能。用户7:点击黑色按钮最好不要有动画,因为不能填数字。用户8:不太明白record保存的是什么,如果可以让玩家自己输入文件名就好了。用户9:可以提示哪些数字是填错的就好了。用户10:游戏介绍是中文的就好了。

voidsudokuGUI::timerSwitch(){if(timer.isActive())timer.stop();else{timer.start();}}7.有动画也挺好看的啊,而且改起来没想象中的简单,就不改了。9.填一个数字按一下hint就可以直到当前填的这个数字是不是错的了10.中文有的字会变为乱码,还是英文比较保险。

考虑的优化如下:我们可以不是对一个确定的数独终盘进行一直来挖空,而是当一个数独终盘一直挖空不出唯一解时,跳到下一个进行执行。优化的代码如下:

if(times>1000){//执行了这个数独终盘1000次还没有解,就做后一个数独终盘来生成。id++;times=0;}阅读作业看DesignbyContract,CodeContract的内容,描述这些做法的优缺点,说明你是如何把它们融入结对作业中的。首先引用一段契约的概念:

契约作用于两方,每一方都会完成一些任务,从而促成契约的达成,但同时,每一方也会接受一些义务,作为制定契约的前提,有任意一方无视了必尽义的义务,则契约失败

契约式编程,我们在面向对象时曾经常用这个概念。我们当时在在设计程序的时候,需要明确地规定一个类的实例,在调用某个操作前后应当属于何种状态。我们当时需要在所有的类和方法前协商了前置条件,后置条件,不变式等等。

优点:代码规范,有利于实现者、设计者、使用者进行协作。缺点:实现起来有困难,而是契约双方都需要履行责任。在一个大的项目里,一旦有人违反契约,后果不堪设想。

我在第二阶段处理异常时,就遇到了『遇到异常,是由我的Core程序catch住保证不crash还是throw给外面catch』的问题。当时弄的很头疼。最后我和我的partner约定了调用Core的要求,保证他调用时的参数是正确的,而另一方面,作为Core核心的编写者,对于预料范围内的参数错误,进行输出错误信息到控制台反馈给了调用者。

说明结对编程的优点和缺点。结对的每一个人的优点和缺点在哪里(要列出至少三个优点和一个缺点)。(5')

partner优缺点

我的优缺点:

InformationHiding就类似面向对象的封装的概念,把一些不能共享或者需要考虑安全的信息封装到内部,不让其他的使用者来修改这部分的内容。最明显的例子就是类里的private成员变量和函数。

InterfaceDesign接口是在一定粒度视图上同类事物的抽象表示。设计一套共用的interface来供多个对象来使用。对象的交互只需要通过接口来完成。

LooseCoupling上计组时高小鹏老师曾经多次强调的代码设计应该保持的风格就是高内聚低耦合,而低耦合的概念就是模块和模块间的联系要少。这样有利于代码移植和互相测试。

具体地在我们的程序中最明显的一点就是,我们用Core模块来包装核心的实现generate等功能,然后生成动态链接库给其它的地方直接调用就好,这样既保证了别人无法修改你的generate函数实现信息隐藏,又非常便于调用和移植。然后互测也只要交换dll就好了,很是方便。

人生第一次这种体验,我们采用的分工的方式,总体上我负责后端Core接口的编写、测试,他负责前端。界面的设计我也参与了其中,提供了一些美工和游戏的玩法设置上的建议,主要是颜色还有Button的颜色啊图片啊等等。形成了现在这种以黑色和红色为主色调的界面(和我最近穿的一件格子衬衫颜色几乎一样.-.)如果你们觉得设计的很土我背锅

然后感觉最大的收获就在于Git操作吧。虽然我们是双线并发作战,但仍然存在着两人一起改的冲突这样的局面,因此也算积累了一些协作编程写仓库的经验吧。下图是我们的Git信息的部分截图。

THE END
1.www.linkchip.cn/show.php/846607.html鍥涳紝一区二区三区高清免费观看视频了锛?30一40一50一级毛片 浜旓紝另类凌辱欧美国产免费锛?好大好粗好爽我要高潮了在线观看 鍏 紝小萝莉交配录象锛?性xⅩXXxXx 涓冿紝天天搞夜夜操 銆愯仈绯绘垜浠 €? 瀹㈡湇鐑 嚎锛?138-2881-646 鍔犺浇鏇村 鐗堟湰鏇存柊 V1.40.17 ,肉文小说https://www.linkchip.cn/show.php/846607.html
2.安卓登录官方14,24小时在线电玩城下载,土豆彩票群怎么运作的 15,集发彩坛2021开奖记录及本期开奖结果,http//xjvip9. 16,香港英皇娱乐新澳博,星彩国际app 17,二字爆特网资料,赢发彩票app下载 18,aqdvip安全检测2,皇宝国际集团是干嘛的 19,9000万彩票大奖,澳门新濠天地开户半岛平台官方网站入口 20,爱拼彩官网,武汉赌球论坛http://m.nzb.ink/143253.html
3.wap.dthdyl.com/cniunews/13235.html红桃38.47 二人做受一级A片添 487.5skins免费领取 共妻nph壁脔╱双性╱调教╱ 高辣h文乱乳H文浪荡np萧太后 巜上司的少妇做爰HD精油按摩 土耳其姓交大大赛最新赛事结果 媚欢(出轨高H) 乳尖春药h糙汉共妻帐中香 feel性丰满白嫩嫩HD 艳妇合欢交换乱尘秘录 欧美野人做爰大片 nba高清在线观看免费Jenn 17c3http://wap.dthdyl.com/cniunews/13235.html
4.入口app2024-12-17 03:46 中欧班列的高效物流服务为德国及欧洲众多企业带来显著收益。其稳定性和可靠性帮助企业优化供应链,确保实现“准时制”运输。“尤其是,在从中国进口产品时,中欧班列显著缩短运输周期,这提升了市场响应速度,为企业在全球竞争中赢得先机。”克吕格尔说。 “这是历史的开始,也是通往http://m.cjzy.pro/856682.html
5.m.vxjdkdk.cn/mayor/74905.html动力动系统15万级“真香”轿车? 全新本田思域2.0L混动亮相, 设计性能全支棱 2024-12-17 15:27:16 1,3次浏览 开篇就问一句:预算15万左右,想买一款既有颜值又能兼顾动力和油耗的轿车,你会怎么选?最近,全新一代本田思域曝光,凭借更激进的造型设计和全新的2.0L混动系统迅速成为车圈焦点。http://m.vxjdkdk.cn/mayor/74905.html
6.m.shidbgs.cn/roughly/85195高H强迫高潮play触手在线观看 东北熟女大黑逼视频 骚女17p 戴璐胸抖 沈先生探花在线高清观看80S 欧美熟妇兽交 日本桥小13XXXXHD 日韩一级婬… 极度重口绿帽羞辱 贱奴被主人扇肿私密跪撅高调教 大屌操嫩逼av 老妇XBXBXBXBXB 秋末冬初,上海银杏观赏之旅 人妻菊眼浣肠开发 脚交网页 民工Hhttp://m.shidbgs.cn/roughly/85195
7.m.shifcgs.cn/appointment/393928.html下载免费在线观看性爱网站安装你想要的应用 更方便 更快捷 发现更多 66%好评(195人) 736 详细信息 软件大小: 785.97MB 最后更新: 2024-12-17 10人妻互换三浦惠理子在线看 乃黄三级 亚木塔子为什么拍av 女警被强摸双乳乳18禁 粉嫩Av精品综合在线 偷拍11P 少人妇妻一级A毛片码 DASD-585黑http://m.shifcgs.cn/appointment/393928.html
8.m.shxywgs.cn/arrival/6128951.html下载台湾足浴激情性爱在线观看安装你想要的应用 更方便 更快捷 发现更多 17%好评(364人) 857 详细信息 软件大小: 231.97MB 最后更新: 2024-12-17 05:44:45 最新版本: V1.56.93 文件格式: apk 应用分类:ios-Android 淫荡调教网站 使用语言: 中文 : 需要联网 系统要求: 5.41以上 应用介绍 http://m.shxywgs.cn/arrival/6128951.html
9.m.wqwgoo.cn/criteria/2838029亚洲–秘社二区少妇17p 陈琪玉足踩踏 男主叫天勒H文小说 2018国产一级天天弄 肉伦疯狂肉体 粗喘娇吟韩国 夜店奶头裸体动漫 女人脱库了给男人吃的东西的软件 cao校花的小说 老头3p老熟女 啊~cao死你个小s货视频 做爰全视频的app免费 亚洲AV无码成人H在线观看福袋 XXXX77 HD国http://m.wqwgoo.cn/criteria/2838029
10.m.shnwjgs.cn/die/5889401太嫩了17p 人C交Z0OZ0OZ 人鱼 李小璐性做爰A片免费看 双性人妖互交localhost 一级黄网站喷奶 69视频永久免费观看下载 熟女情趣丝袜高跟视频 偷拍黑客日本久久免费 好硬插的太深了,麻豆免费视频 快灬快灬?一下爽69动态图 粉嫩白丝jk被啪国产在线 嫩模易阳内部视频 肉感巨凥日本在线观看 http://m.shnwjgs.cn/die/5889401
11.m.shnudgs.cn/orientation/77650搜索一级黄片人与兽 啊cao翻你个小sao货视频 色欲av无码人妻精品 美女高潮爽到喷出来尿的视频 糟老头免费无码大片 http://jtv8866.Pro n中国艳妇肉体pics 一女被两男玩弄A片喷水动态图 台湾三级片强操 三年强奸肉丝女 玩弄人妻少妇系列伦子君影视 女佣。毛茸茸的阴户视频 希崎在线人妻 熟女操http://m.shnudgs.cn/orientation/77650
12.m.sheodkj.cn/divide/4884753.html成年性视频在线视频 丰满白嫩少妇肉肉大HDXXXX 羞羞妺网站 甘婷婷被揉到高潮下不了床 嗯进去不要痛视频 无码av中文专区久久专区 不知火舞扒开胸罩 给男生动漫 Chinese多毛丰满HD 国产一级a毛,一级a看无百视频免费看。 pkf女尸Ⅴk 一边摸一边亲的免费视频网站 色天堂久月天 V9.40.17 sm脚奴调http://m.sheodkj.cn/divide/4884753.html
13.m.longhuajinruiqi.cn/detail/75697.html软件大小: 732.97MB 最后更新: 2024-12-16 21:54:16 最新版本: V6.46.51 文件格式: apk 应用分类:ios-Android 69~伪装の微笑动漫在线看 使用语言: 中文 : 需要联网 系统要求: 5.41以上 应用介绍 一,51美女秘?片黄在线观看成欢阁,打白嫩秘?光屁屁91网站 二,100?140照片是几寸的http://m.longhuajinruiqi.cn/detail/75697.html
14.m.shnubgs.cn/public/865775.html一,友田真希在线播放AV ,国产玉足脚交 二,饼干姐姐在线观看免费完整版糖心女王,女胸18 网站100%无 三,欧美人与拘一级A片视频,成人色情美女裸体的软件 四,小婷被老外性调教1,日本特级作爱片苍井空50分钟 五,同性西装皮鞋肌肉男与他的腹肌小伴侣 -- 69XX,女女女女女CCBBB裸体 六,一级黄片大鸡巴操逼,http://m.shnubgs.cn/public/865775.html
15.数独游戏求解算法数独是一个非常有名的游戏。整个是一个9X9的大宫格,其中又被划分成9个3X3的小宫格。要求在每个小格中放入1-9中的某个数字。要求是:每行、每列、每个小宫格中数字不能重复。 现要求用计算机求解数独。 import java.io.*; public class Main { public static void main(String[] args) throws FileNothttps://blog.csdn.net/weixin_39393896/article/details/105720306
16.欧泊颗数独小丑导航网欧泊颗数独浏览人数已经达到12,如你需要查询该站的相关权重信息,可以点击"5118数据""爱站数据""Chinaz数据"进入;以目前的网站数据参考,建议大家请以爱站数据为准,更多网站价值评估因素如:欧泊颗数独的访问速度、搜索引擎收录以及索引量、用户体验等;当然要评估一个站的价值,最主要还是需要根据您自身的需求以及需要,一http://www.xcdir.com/sites/15072.html
17.wap.huaxinet.com/turingvr/37371亚洲同志17-18 Ga9 男人和女人在床上玩的软件视频在现观看 撑大逼视频 淫穴欠操中文字幕 下载个免费一级黄色靠逼直播 日本美女被强暴网站 韩国猛男与美女猛操 五月天情趣网 花井メイサAV片在线播放 姜姗黑牛最新章节更新 阿树的twitter 俄罗斯女孩的小嫩穴 欧洲裸女打靶训练 拍情趣衣服后被做http://wap.huaxinet.com/turingvr/37371_552238
18.在线数独在线数独。四个级别的难度。打印数独谜题。免费数独游戏的乐趣。https://sudoku-cn.com/
19.《欧泊颗数独游戏在线》免费电影在线观看更新:2024-10-31 简介:我总觉得,我挺对不起他们的详情 立即播放 无需安装任何插件 在线观看 第01集 第2集 第3集 第4集 第5集 第6集 第7集 第8集 第9集 第10集 第11集 第12集 第13集 第14集 第15集 第16集 第17集 第18集 第19集 http://www.hgqzysg.com/pavilion/1223469/39963845336158.html
20.《欧泊颗数独游戏在线》电视剧在线播放第03集 第04集 第05集 第06集 第07集 第08集 第09集 第10集 第11集 第12集 第13集 第14集 第15集 第16集 第17集 欧泊颗数独游戏在线:剧情简介 导演:urga顏麗如 主演:托比·马奎尔,Vujanovic 该剧讲述了沈芷琪说着不忘朝旁边的女生眨眨眼,小女生脸皮薄,经不住她这样说,http://www.jizhang68.com/play/20241117/yetbw.html
21.超脑思维:数独游戏技巧从入门到精通最新章节欧泊颗著书名:超脑思维:数独游戏技巧从入门到精通 作者:欧泊颗 校对:第十三年 排版:第十三年 ISBN:9787509384701 本书由中国法制出版社授权掌阅科技电子版制作与发行 版权所有·侵权必究 前言 作为“数独天书”系列的第二弹,本书系统详尽地讲解了从初级到骨灰级常用的各类数独推理技巧,并附有适合各水平爱好者的练习https://m.zhangyue.com/readbook/11524689/1
22.每日数独每日一题欧泊.pdf内容提供方:. 大小:84.59 KB 字数:约1.3千字 发布时间:2023-08-17发布于河南 浏览人气:269 下载次数:仅上传者可见 收藏次数:0 需要金币:*** 金币 (10金币=人民币1元)每日数独每日一题欧泊 .pdf 关闭预览 想预览更多内容,点击免费在线预览全文 免费在线预览全文 每日数独每日一题欧泊 今天小金豆https://m.book118.com/html/2023/0816/6205022145005213.shtm
23.数独游戏技巧从入门到精通(欧泊颗万题版)简介,目录书摘Part 02 蓝天分级数独谜题 141 一、蓝天一级——初心级 141 二、蓝天二级——入门级 143 三、蓝天三级——初级 146 四、蓝天四级——中级 148 八、蓝天八级——中度骨灰级 158 五、蓝天五级——高级(第41题) 176 六、蓝天六级——超高级(第51题) 179 https://www.jd.com/jxinfo/9d129cb029919d9e.html
24.数独实例对角线数独·骨灰级·解题实例题目是欧泊颗数独网站的骨灰对角线 规则:标准数独基础上,两条对角线也分别是1~9 解题有两条原则: ①尽量多地进行基于标准数独基础上的观察,能用基础规则观察到的,不要用规则。 ②尽量先把对角线上的数字出完。 很简易的排除法。注意三宫的239数组,尤其是2的位置。 https://www.360doc.cn/article/29525198_594238524.html