- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
算法分析及设计大作业
问题描述在本次算法分析的课堂演示中,我做的是一个关于“裁切悖论——消失的正方形的PPT”,但是由于代码的问题,现在借鉴了同学的实验,写了一个关于数独算法的小题目。如下图所示,有一个9*9的正方形,而正方形又分成了九个小正方形,现在已经在图示的正方形中给出了一些方格中的数字,要求将正方形中所有小方格的数字填充完,并且每个小正方形以及每行、每列,只能出现一次1~9这九个数字。68795764832469412353178921763解决方案我们先假设填入的数字为0~8共9个数字。将整个图分成9个3*3的方块,从左到右,从上到下,依次编号0~8。填每个格子的时候,我们可以选择.0~8。对于选择的数字,有3种限制,我们通过这三种限制来对回溯过程进行剪枝。1.行不重复 ?r[9][9]2.列不重复 ?c[9][9]3.块不重复 ?b[9][9]对使用3个9×9的数组来描述这三种限制。对于行 n 来说,所有之前填过的数字nums,都有r[n][nums] = 1。同理,对与列与块来说,之前每个填过的数字都相应标记为1。当尝试向一个格子[row][col] (块序号为bi)填充数据i(0=i=8,的时候,如果对应r[row][i] =1 或 c[col][i] = 1 或 b[bi][i] =1,说明无法满足条件,是非法的。)这时再尝试i = i+1.当向坐标为[row][col] 填入一个满足条件的数字i的时候,我们更新限制数组如下? r[row][i] = 1;? c[col][i] = 1;? b[bi][i] = 1;然后坐标移到下一个,这里选用的顺序是右移动。对于一个格子CX的后续CY,如果我们遍历0~9完成,那么返回。尝试CX的其他可能性。当填入的格子是 [8][8]时,整个问题处理完毕。对于给定的输入,直接将初始状态的矩阵设置成相应的值,同时,根据给定的值,设置初始的r, c, b的限制条件。当读到的格子内已经有给定值的时候,无需做其他尝试,直接进入处理下一个格子。实际填入的是1~9,所以要对0~8做一点转换。对于每次尝试完一个可能填入的数后,需要恢复现场,包括将该格子内的数重置为初始值0.同时,相应的限制条件r,c,b都应把刚才填入的值的位置0.代码实现下面给出这道题目的实现代码:打开codeblocks,新建一个项目;编写代码。代码如下:#include stdlib.h#include stdio.h#define MMAX 9char M[MMAX][MMAX] = {{0}};int count = 0;int getblockid(int row, int col){ return row/3 * 3 + col/3;}void getnext(int *row, int *col, int* nrow, int* ncol){if(*col ==8){ *ncol = 0; *nrow = (*row)+1; }Else{ *nrow = *row; *ncol = (*col) +1; }}void outputmatrix(char mtr[MMAX][MMAX] ){ int i, j;for(i=0;iMMAX;i++){ for(j = 0; jMMAX;j++){ printf(%d , mtr[i][j]); } printf ( \n ); }}void fill(int row, int col, char matrix[MMAX][MMAX], char rowd[][MMAX], char cold[][MMAX], char blod[][MMAX]){ count ++;if(matrix[row][col] != 0){ if(row == 8 col == 8){ outputmatrix(matrix); return; } int nr, nc; getnext(row,col,nr,nc); fill(nr,nc,matrix,rowd,cold,blod); return; } int i = 1; char mtr[MMAX][MMAX]; memcpy(mtr, matrix, MMAX*MMAX*sizeof(char));for(;i= 9;i++){ //duplicate all data int blockid = getbloc
文档评论(0)